android-拨打whatsapp电话

问题描述 投票:0回答:8

我想向特定用户拨打 WhatsApp 电话。我试过了,但不起作用:

Uri uri = Uri.parse("callto:" + phoneNUmber);
Intent i = new Intent(Intent.ACTION_CALL, uri);
i.setPackage("com.whatsapp");
startActivity(i);

我知道如何创建 WhatsApp 消息,代码类似并且有效:

Uri uri = Uri.parse("smsto:" + phoneNUmber);
Intent i = new Intent(Intent.ACTION_SENDTO, uri);
i.setPackage("com.whatsapp");
startActivity(i);
java android whatsapp
8个回答
21
投票

简单的解决方案是,查询 ContactContract.Data 的 _id 和 MIME 类型。

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 );

}

输出将如下所示

12561 雪 vnd.android.cursor.item/vnd.com.whatsapp.profile

12562雪vnd.android.cursor.item/vnd.com.whatsapp.voip.call

现在仅将 MIME 类型为

vnd.android.cursor.item/vnd.com.whatsapp.voip.call

的 _Id 保存在数据库或其他地方

然后您可以像这样与这些联系人发起 Whatsapp 通话

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);

14
投票

要进行 WhatsApp 视频通话,请使用以下 mime 字符串:

String mimeString = "vnd.android.cursor.item/vnd.com.whatsapp.video.call";

要进行 WhatsApp 语音通话,请使用以下 mime 字符串:

 String mimeString = "vnd.android.cursor.item/vnd.com.whatsapp.voip.call";

使用以下代码:

 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);
        }
    }
}

6
投票

此代码是检查号码是否有whatsapp并进行whatsapp音频和视频通话

首先检查号码是否有whatsapp...如果你不知道

 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;
        }
    }

2
投票

如果我们传递 rawContactId,那么我们可以使用它来直接获取与 Whatsapp 呼叫 URI 关联的 ID。

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;

}

2
投票

@Adnan Khan 提供的答案适用于 Android 11,但我想提供他的答案的 Kotlin 版本:

val resolver: ContentResolver = requireContext().contentResolver
val cursor: Cursor? = resolver.query(
    ContactsContract.Data.CONTENT_URI,
        null, null, null,
    ContactsContract.Contacts.DISPLAY_NAME)

while(cursor!!.moveToNext()) {
    val _id: Long = cursor.getLong(cursor.getColumnIndex(ContactsContract.Data._ID))
    val displayName: String = cursor.getString(cursor.getColumnIndex(ContactsContract.Data.DISPLAY_NAME))
    val mimeType: String = cursor.getString(cursor.getColumnIndex(ContactsContract.Data.MIMETYPE))

    Log.i("Intents", "$_id $displayName $mimeType")

现在,Kotlin 中的意图是这样的: _id是你之前路由得到的值

val intent = Intent()
intent.action = Intent.ACTION_VIEW
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)

最后但并非最不重要的是将以下内容添加到 AndroidManifest.xml 中:

<uses-permission
    android:name="android.permission.CALL_PHONE"
    androd:maxSdkVersion="30" />
<uses-permission
    android:name="android.permission.READ_CONTACTS"
    androd:maxSdkVersion="30" />

此后,您需要进入设置 -> 应用程序 -> 选择您的应用程序并将这两个权限标记为允许。

应用程序应该有一种方式在第一次运行时询问您,但这是另一个主题。


1
投票
// 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;
        }
    }

0
投票
    iv_whatsapp_call.setOnClickListener {
        // val dialIntent = Intent(Intent.ACTION_DIAL)
        // dialIntent.data = Uri.parse("tel:" + et_whatsapp.text.toString())
        // startActivity(dialIntent)
        val mimeString = "vnd.android.cursor.item/vnd.com.whatsapp.voip.call"

        val resolver: ContentResolver = applicationContext.contentResolver
        val cursor: Cursor? = resolver.query(ContactsContract.Data.CONTENT_URI, null, null, null, ContactsContract.Contacts.DISPLAY_NAME)

        while(cursor!!.moveToNext()) {
            var Col_Index = cursor!!.getColumnIndex(ContactsContract.CommonDataKinds.Phone._ID)
            val _id = cursor.getLong(Col_Index)

            Col_Index = cursor!!.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER)
            var number = cursor.getString(Col_Index)

            Col_Index = cursor!!.getColumnIndex(ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME)
            val displayName = cursor.getString(Col_Index)

            Col_Index = cursor!!.getColumnIndex(ContactsContract.CommonDataKinds.Phone.MIMETYPE)
            val mimeType = cursor.getString(Col_Index)
            // println("Data: " + _id.toString() + " ---" + displayName + "---" + number + "---" + mimeType )

            var my_number = et_whatsapp.text.toString()
            my_number = my_number.replace(" ","")
            my_number = my_number.replace("+","")


            if(number.isNullOrBlank() == false) {
                // println("Number : " + number )
                number = number.replace(" ", "")
                number = number.replace("+", "")

                // my_number.substring(1)
                // println(">>" + my_number)
                if (number.endsWith(my_number.substring(1) + "@s.whatsapp.net")){
                    if (mimeType.equals(mimeString)) {
                        val data = "content://com.android.contacts/data/$_id"
                        val sendIntent = Intent()
                        sendIntent.action = Intent.ACTION_VIEW
                        sendIntent.setDataAndType(Uri.parse(data), mimeString)
                        sendIntent.setPackage("com.whatsapp")
                        startActivity(sendIntent)
                        break;
                    }
                }
            }
        }
    }

0
投票

对于那些迟到的人:希望这个答案能够通过提供从电话号码到

Intent
发起视频通话的简化流程来改进其他答案。

请注意,只有在设备上注册了联系人并且安装了 WhatsApp 时,此功能才有效。在清单中,您将需要权限

READ_CONTACTS
CALL_PHONE
,以及定义
<queries>
包的
com.whatsapp
标签。

private void call(String phoneNumber) {
    Long contactId = this.findContactId(phoneNumber);
    if(contactId == null){
        this.message("No contact registered with this phone number.");
        return;
    }
    Long dataId = this.findWAVideoCallDataId(contactId);
    if(dataId == null){
        this.message("Contact has no whatsapp video call link.");
        return;
    }
    this.openVideoCallAppLink(dataId);
}

这将查询

Contacts
表并返回与电话号码关联的
ContactId

private Long findContactId(String phoneNumber) {
    ContentResolver resolver = getApplicationContext().getContentResolver();
    Uri filterUri = Uri.withAppendedPath(ContactsContract.CommonDataKinds.Phone.CONTENT_FILTER_URI, Uri.encode(phoneNumber));

    String[] projection = new String[]{ContactsContract.CommonDataKinds.Phone.CONTACT_ID};

    Cursor cursor = resolver.query(filterUri, projection, null, null, null);
    try {
        if (cursor.moveToNext()) {
            return cursor.getLong(cursor.getColumnIndexOrThrow(ContactsContract.CommonDataKinds.Phone.CONTACT_ID));
        }
    } finally {
        cursor.close();
    }
    return null;
}

这将查询

Data
表并查找与具有 mimeType
ContactId
vnd.android.cursor.item/vnd.com.whatsapp.video.call

关联的子记录
private Long findWAVideoCallDataId(Long contactId) {
    String[] projection = new String[]{ContactsContract.Data._ID};

    String selection = ContactsContract.Data.CONTACT_ID + " = ? AND " + ContactsContract.Data.MIMETYPE + " = ?";
    String[] selectionArgs = new String[]{contactId.toString(), "vnd.android.cursor.item/vnd.com.whatsapp.video.call"};

    Cursor cursor = getApplicationContext().getContentResolver().query(
            ContactsContract.Data.CONTENT_URI,
            projection,
            selection,
            selectionArgs,
            null
    );

    if (cursor != null) {
        try {
            if (cursor.moveToNext()) {
                return cursor.getLong(cursor.getColumnIndexOrThrow(ContactsContract.Data._ID));
            }
        } finally {
            cursor.close();
        }
    }

    return null;
}

最后,这个

DataId
用来组成
Intent
的URI。

private void openVideoCallAppLink(Long dataId) {
    Intent intent = new Intent(Intent.ACTION_VIEW);

    intent.setDataAndType(Uri.parse("content://com.android.contacts/data/" + dataId),
            "vnd.android.cursor.item/vnd.com.whatsapp.video.call");

    intent.setPackage("com.whatsapp");

    if (intent.resolveActivity(getPackageManager()) != null) {
        startActivity(intent);
    } else {
        message("No app resolved to open whatsapp link.");
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.