进行WhatsApp语音/视频通话

时间:2018-10-18 14:08:55

标签: android whatsapp

我正在尝试找出如何直接从应用程序进行whatsapp呼叫(视频和语音)的方法。我读了这篇文章:android-make whatsapp call,但我听不懂。我希望用户能够从他们的联系人列表中选择一个联系人,然后将他们带到具有两个按钮的屏幕:“视频通话”和“语音通话”。联系人的电话号码也将在顶部显示为文本视图。他们可以单击任一按钮,该应用程序将拨打whatsapp呼叫。我不确定如何获取特定联系人的ID并进行呼叫。

如果有人可以用另一种方式解释它,我将非常感激。

谢谢

1 个答案:

答案 0 :(得分:0)

我刚刚弄清楚这是什么意思,所以我想与其他人分享这件事,以防其他人也感到困惑。抱歉,如果其中一些不是100%正确。

要发送whatsapp通话/视频通话,您需要获取联系人的 ID 。不只是任何ID,还有具有特定 mimetype 的ID(适用于whatsapp)。这些模仿类型是 vnd.android.cursor.item / vnd.com.whatsapp.video.call vnd.android.cursor.item / vnd.com.whatsapp.voip.call

要查询ID,您必须使用内容解析器。 ContactsContract.Data.CONTENT_URI 从联系人获取数据并将其发送回去。您可以通过指定投影来进一步减少查询的内容。投影是您希望其返回的列,例如联系人姓名,电话号码。如果将其保留为null,则不会过滤掉任何数据。它是可选的。如果您确实使用投影,请确保包括以下两列以供返回: ContactsContract.Data._ID,ContactsContract.Data.DISPLAY_NAME,ContactsContract.Data.MIMETYPE。

// here is how to make a projection. you have to use an array. My example only returns the ID, Name of Contact and Mimetype. 

String[] projection = = new String[] {ContactsContract.Data._ID, ContactsContract.Data.DISPLAY_NAME, ContactsContract.Data.MIMETYPE};


ContentResolver resolver = context.getContentResolver();  
cursor = resolver.query(
            ContactsContract.Data.CONTENT_URI,
            projection, null, null,
            ContactsContract.Contacts.DISPLAY_NAME);

在光标取回信息之后,您可以使用此代码进行浏览。它的作用是当光标移至下一个联系人时,它将ID,显示名称和模仿类型存储在3个单独的变量中。它使用 cursor.getColumnIndex()返回适当的列,然后使用 cursor.getLong()获得该列的实际值。

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


                if (mimeType.equals("vnd.android.cursor.item/vnd.com.whatsapp.voip.call") || mimeType.equals("vnd.android.cursor.item/vnd.com.whatsapp.video.call")) {
                     // store in database

if (mimeType.equals("vnd.android.cursor.item/vnd.com.whatsapp.voip.call")) {
String voiceCallID = Long.toString(_id);

    }
    else{
    String videoCallID = Long.toString(_id);
    }

     }

   }
}

您还需要检查模仿类型是 vnd.android.cursor.item / vnd.com.whatsapp.video.call (用于视频通话)还是 vnd.android .cursor.item / vnd.com.whatsapp.voip.call (用于语音通话) 为此,我使用了if语句(如果为真),将其存储到您的数据库中。光标将遍历每个联系人的每个模仿类型。因此,它将一次通过视频通话模拟类型,一次通过语音通话模拟类型。

然后,为了使whatsapp呼叫某人,请检索语音或视频的ID并将其放在id参数中。确保它是正确的,然后调用正确的方法,否则它将不起作用。

    public void voiceCall(String id){
                Intent intent = new Intent();
                intent.setAction(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);

}

视频通话:

public void videoCall(String id){
                Intent intent = new Intent();
                intent.setAction(Intent.ACTION_VIEW);

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

                startActivity(intent);

}

就是这样!如果有任何错误或可以更简单地解释的位,请注释!