问题
I want to make a WhatsApp call to a specific user. I tried this and it doesn't work:
Uri uri = Uri.parse("callto:" + phoneNUmber);
Intent i = new Intent(Intent.ACTION_CALL, uri);
i.setPackage("com.whatsapp");
startActivity(i);
I know how to create a WhatsApp message, the code is similar and it works:
Uri uri = Uri.parse("smsto:" + phoneNUmber);
Intent i = new Intent(Intent.ACTION_SENDTO, uri);
i.setPackage("com.whatsapp");
startActivity(i);
回答1:
Simple solution is, Query ContactContract.Data for the _id and MIME type.
ContentResolver resolver = context.getContentResolver();
cursor = resolver.query(
ContactsContract.Data.CONTENT_URI,
null, null, null,
ContactsContract.Contacts.DISPLAY_NAME);
//Now read data from cursor like
while (cursor.moveToNext()) {
long _id = cursor.getLong(cursor.getColumnIndex(ContactsContract.Data._ID));
String displayName = cursor.getString(cursor.getColumnIndex(ContactsContract.Data.DISPLAY_NAME));
String mimeType = cursor.getString(cursor.getColumnIndex(ContactsContract.Data.MIMETYPE));
Log.d("Data", _id+ " "+ displayName + " " + mimeType );
}
The output will be like the following
12561 Snow vnd.android.cursor.item/vnd.com.whatsapp.profile
12562 Snow vnd.android.cursor.item/vnd.com.whatsapp.voip.call
Now save in DB or somewhere else only those _Ids whose MIME type is vnd.android.cursor.item/vnd.com.whatsapp.voip.call
And then you initiate Whatsapp call with those contacts like this way
Intent intent = new Intent();
intent.setAction(Intent.ACTION_VIEW);
// the _ids you save goes here at the end of /data/12562
intent.setDataAndType(Uri.parse("content://com.android.contacts/data/_id"),
"vnd.android.cursor.item/vnd.com.whatsapp.voip.call");
intent.setPackage("com.whatsapp");
startActivity(intent);
回答2:
To make WhatsApp video call use below mime-string:
String mimeString = "vnd.android.cursor.item/vnd.com.whatsapp.video.call";
To make WhatsApp voice call use below mime-string:
String mimeString = "vnd.android.cursor.item/vnd.com.whatsapp.voip.call";
Use Below Code:
String displayName = null;
String name="ABC" // here you can give static name.
Long _id;
ContentResolver resolver = getApplicationContext().getContentResolver();
cursor = resolver.query(ContactsContract.Data.CONTENT_URI, null, null, null, ContactsContract.Contacts.DISPLAY_NAME);
while (cursor.moveToNext()) {
_id = cursor.getLong(cursor.getColumnIndex(ContactsContract.Data._ID));
displayName = cursor.getString(cursor.getColumnIndex(ContactsContract.Data.DISPLAY_NAME));
String mimeType = cursor.getString(cursor.getColumnIndex(ContactsContract.Data.MIMETYPE));
if (displayName.equals(name)) {
if (mimeType.equals(mimeString)) {
String data = "content://com.android.contacts/data/" + _id;
Intent sendIntent = new Intent();
sendIntent.setAction(Intent.ACTION_VIEW);
sendIntent.setDataAndType(Uri.parse(data), mimeString);
sendIntent.setPackage("com.whatsapp");
startActivity(sendIntent);
}
}
}
回答3:
this code is to check number has whatsapp or not and make whatsapp audio and video call
first check wether number have whatsapp or not ...if you dont know
if rowContactId (return type of hasWhatsapp) is not equal to '0' then this number has whatsapp.
.
public String hasWhatsapp( getContactIDFromNumber(795486179).toString(),MAinactivity.this )
{
String rowContactId = null;
boolean hasWhatsApp;
String[] projection = new String[]{ContactsContract.RawContacts._ID};
String selection = ContactsContract.Data.CONTACT_ID + " = ? AND account_type IN (?)";
String[] selectionArgs = new String[]{contactID, "com.whatsapp"};
Cursor cursor = getContentResolver().query(ContactsContract.RawContacts.CONTENT_URI, projection, selection, selectionArgs, null);
if (cursor != null) {
hasWhatsApp = cursor.moveToNext();
if (hasWhatsApp) {
rowContactId = cursor.getString(0);
}
cursor.close();
}
return rowContactId;
}
public static int getContactIDFromNumber( contactNumber,Context context)
{
contactNumber = Uri.encode(contactNumber);
int phoneContactID = new Random().nextInt();
Cursor contactLookupCursor = context.getContentResolver().query(Uri.withAppendedPath(ContactsContract.PhoneLookup.CONTENT_FILTER_URI,contactNumber),new String[] {ContactsContract.PhoneLookup.DISPLAY_NAME, ContactsContract.PhoneLookup._ID}, null, null, null);
while(contactLookupCursor.moveToNext())
{
phoneContactID = contactLookupCursor.getInt(contactLookupCursor.getColumnIndexOrThrow(ContactsContract.PhoneLookup._ID));
}
contactLookupCursor.close();
return phoneContactID;
}
//your number is support for whatsapp then come to here to make whatsapp call
// this is for whatsapp call
wtsapp_call.setOnClickListener(new View.OnClickListener()
{
@Override
public void onClick(View v)
{
String mimeString = "vnd.android.cursor.item/vnd.com.whatsapp.voip.call";
Intent intent = new Intent();
intent.setAction(Intent.ACTION_VIEW);
//here you have to pass whatsApp contact number as contact_number ..
String name= getContactName( contact_number, MainActivity.this);
int whatsappcall=getContactIdForWhatsAppCall(name,MainActivity.this);
if (whatsappcall!=0) {
intent.setDataAndType(Uri.parse("content://com.android.contacts/data/" +whatsappcall),
"vnd.android.cursor.item/vnd.com.whatsapp.voip.call");
intent.setPackage("com.whatsapp");
startActivityForResult(intent, WHATSAPP_NUMMBER);
}
}
});
//for whatsapp video call
wtsapp_video.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v)
{
Intent intent = new Intent();
intent.setAction(Intent.ACTION_VIEW);
//here you have to pass whatsApp contact number as number..
String name= getContactName( number, MainActivity.this);
int videocall=getContactIdForWhatsAppVideoCall(name,MainActivity.this);
if (videocall!=0)
{
intent.setDataAndType(Uri.parse("content://com.android.contacts/data/" +videocall),
"vnd.android.cursor.item/vnd.com.whatsapp.video.call");
intent.setPackage("com.whatsapp");
startActivity(intent);
}
}
});
public String getContactName(final String phoneNumber, Context context)
{
Uri uri=Uri.withAppendedPath(ContactsContract.PhoneLookup.CONTENT_FILTER_URI,Uri.encode(phoneNumber));
String[] projection = new String[]{ContactsContract.PhoneLookup.DISPLAY_NAME};
String contactName="";
Cursor cursor=context.getContentResolver().query(uri,projection,null,null,null);
if (cursor != null) {
if(cursor.moveToFirst()) {
contactName=cursor.getString(0);
}
cursor.close();
}
return contactName;
}
public int getContactIdForWhatsAppCall(String name,Context context)
{
cursor = getContentResolver().query(
ContactsContract.Data.CONTENT_URI,
new String[]{ContactsContract.Data._ID},
ContactsContract.Data.DISPLAY_NAME + "=? and "+ContactsContract.Data.MIMETYPE+ "=?",
new String[] {name,"vnd.android.cursor.item/vnd.com.whatsapp.voip.call"},
ContactsContract.Contacts.DISPLAY_NAME);
if (cursor.getCount()>0)
{
cursor.moveToNext();
int phoneContactID= cursor.getInt(cursor.getColumnIndex(ContactsContract.Data._ID));
System.out.println("9999999999999999 name "+name+" id "+phoneContactID);
return phoneContactID;
}
else
{
System.out.println("8888888888888888888 ");
return 0;
}
}
public int getContactIdForWhatsAppVideoCall(String name,Context context)
{
Cursor cursor = getContentResolver().query(
ContactsContract.Data.CONTENT_URI,
new String[]{ContactsContract.Data._ID},
ContactsContract.Data.DISPLAY_NAME + "=? and "+ContactsContract.Data.MIMETYPE+ "=?",
new String[] {name,"vnd.android.cursor.item/vnd.com.whatsapp.video.call"},
ContactsContract.Contacts.DISPLAY_NAME);
if (cursor.getCount()>0)
{
cursor.moveToFirst();
int phoneContactID= cursor.getInt(cursor.getColumnIndex(ContactsContract.Data._ID));
return phoneContactID;
}
else
{
System.out.println("8888888888888888888 ");
return 0;
}
}
回答4:
If we pass rawContactId, then we can use that to directly fetch the ID associated with the whatsapp call URI.
private void whatsAppCall(Context context, String rawContactId) {
try {
int id = whatsAppCallId(context, rawContactId);
Intent intent = new Intent();
intent.setAction(Intent.ACTION_VIEW);
String uriString = "content://com.android.contacts/data/" + id;
intent.setDataAndType(Uri.parse(uriString), "vnd.android.cursor.item/vnd.com.whatsapp.voip.call");
intent.setPackage("com.whatsapp");
startActivity(intent);
} catch (Exception e) {
Log.e(TAG, "whatsAppCall Exception: " + e);
}
}
private long whatsAppCallId(Context context, String rawContactId){
ContentResolver resolver = context.getContentResolver();
String selection = ContactsContract.Data.MIMETYPE + " = ? AND " + ContactsContract.Data.RAW_CONTACT_ID + " = ? ";
String[] selectionArgs = new String[] { "vnd.android.cursor.item/vnd.com.whatsapp.voip.call", rawContactId };
Cursor cursor = resolver.query(
ContactsContract.Data.CONTENT_URI,
null, selection, selectionArgs,
ContactsContract.Contacts.DISPLAY_NAME);
long _id=0;
while (cursor.moveToNext()) {
_id = cursor.getLong(cursor.getColumnIndex(ContactsContract.Data._ID));
String displayName = cursor.getString(cursor.getColumnIndex(ContactsContract.Data.DISPLAY_NAME));
String mimeType = cursor.getString(cursor.getColumnIndex(ContactsContract.Data.MIMETYPE));
Log.d(TAG, "Data: " + _id+ " "+ displayName + " " + mimeType );
}
return _id;
}
回答5:
// first check wether number have whatsapp or not ...if you dont know
//if rowContactId (return type of hasWhatsapp) is not equal to '0' then this number has whatsapp..
public String hasWhatsapp( getContactIDFromNumber(795486179).toString(),MAinactivity.this )
{
String rowContactId = null;
boolean hasWhatsApp;
String[] projection = new String[]{ContactsContract.RawContacts._ID};
String selection = ContactsContract.Data.CONTACT_ID + " = ? AND account_type IN (?)";
String[] selectionArgs = new String[]{contactID, "com.whatsapp"};
Cursor cursor = getContentResolver().query(ContactsContract.RawContacts.CONTENT_URI, projection, selection, selectionArgs, null);
if (cursor != null) {
hasWhatsApp = cursor.moveToNext();
if (hasWhatsApp) {
rowContactId = cursor.getString(0);
}
cursor.close();
}
return rowContactId;
}
public static int getContactIDFromNumber( contactNumber,Context context)
{
contactNumber = Uri.encode(contactNumber);
int phoneContactID = new Random().nextInt();
Cursor contactLookupCursor = context.getContentResolver().query(Uri.withAppendedPath(ContactsContract.PhoneLookup.CONTENT_FILTER_URI,contactNumber),new String[] {ContactsContract.PhoneLookup.DISPLAY_NAME, ContactsContract.PhoneLookup._ID}, null, null, null);
while(contactLookupCursor.moveToNext())
{
phoneContactID = contactLookupCursor.getInt(contactLookupCursor.getColumnIndexOrThrow(ContactsContract.PhoneLookup._ID));
}
contactLookupCursor.close();
return phoneContactID;
}
//your number is support for whatsapp then come to here to make whatsapp call
// this is for whatsapp call
wtsapp_call.setOnClickListener(new View.OnClickListener()
{
@Override
public void onClick(View v)
{
String mimeString = "vnd.android.cursor.item/vnd.com.whatsapp.voip.call";
Intent intent = new Intent();
intent.setAction(Intent.ACTION_VIEW);
//here you have to pass whatsApp contact number as contact_number ..
String name= getContactName( contact_number, MainActivity.this);
int whatsappcall=getContactIdForWhatsAppCall(name,MainActivity.this);
if (whatsappcall!=0) {
intent.setDataAndType(Uri.parse("content://com.android.contacts/data/" +whatsappcall),
"vnd.android.cursor.item/vnd.com.whatsapp.voip.call");
intent.setPackage("com.whatsapp");
startActivityForResult(intent, WHATSAPP_NUMMBER);
}
}
});
//for whatsapp video call
wtsapp_video.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v)
{
Intent intent = new Intent();
intent.setAction(Intent.ACTION_VIEW);
//here you have to pass whatsApp contact number as number..
String name= getContactName( number, MainActivity.this);
int videocall=getContactIdForWhatsAppVideoCall(name,MainActivity.this);
if (videocall!=0)
{
intent.setDataAndType(Uri.parse("content://com.android.contacts/data/" +videocall),
"vnd.android.cursor.item/vnd.com.whatsapp.video.call");
intent.setPackage("com.whatsapp");
startActivity(intent);
}
}
});
public String getContactName(final String phoneNumber, Context context)
{
Uri uri=Uri.withAppendedPath(ContactsContract.PhoneLookup.CONTENT_FILTER_URI,Uri.encode(phoneNumber));
String[] projection = new String[]{ContactsContract.PhoneLookup.DISPLAY_NAME};
String contactName="";
Cursor cursor=context.getContentResolver().query(uri,projection,null,null,null);
if (cursor != null) {
if(cursor.moveToFirst()) {
contactName=cursor.getString(0);
}
cursor.close();
}
return contactName;
}
public int getContactIdForWhatsAppCall(String name,Context context)
{
cursor = getContentResolver().query(
ContactsContract.Data.CONTENT_URI,
new String[]{ContactsContract.Data._ID},
ContactsContract.Data.DISPLAY_NAME + "=? and "+ContactsContract.Data.MIMETYPE+ "=?",
new String[] {name,"vnd.android.cursor.item/vnd.com.whatsapp.voip.call"},
ContactsContract.Contacts.DISPLAY_NAME);
if (cursor.getCount()>0)
{
cursor.moveToNext();
int phoneContactID= cursor.getInt(cursor.getColumnIndex(ContactsContract.Data._ID));
System.out.println("9999999999999999 name "+name+" id "+phoneContactID);
return phoneContactID;
}
else
{
System.out.println("8888888888888888888 ");
return 0;
}
}
public int getContactIdForWhatsAppVideoCall(String name,Context context)
{
Cursor cursor = getContentResolver().query(
ContactsContract.Data.CONTENT_URI,
new String[]{ContactsContract.Data._ID},
ContactsContract.Data.DISPLAY_NAME + "=? and "+ContactsContract.Data.MIMETYPE+ "=?",
new String[] {name,"vnd.android.cursor.item/vnd.com.whatsapp.video.call"},
ContactsContract.Contacts.DISPLAY_NAME);
if (cursor.getCount()>0)
{
cursor.moveToFirst();
int phoneContactID= cursor.getInt(cursor.getColumnIndex(ContactsContract.Data._ID));
return phoneContactID;
}
else
{
System.out.println("8888888888888888888 ");
return 0;
}
}
来源:https://stackoverflow.com/questions/38655458/android-make-whatsapp-call