Android 拨打WhatsApp语音/视频电话

Android 拨打WhatsApp语音/视频电话,android,whatsapp,Android,Whatsapp,我想知道如何直接从应用程序拨打whatsapp电话(视频和语音)。我读了这篇文章:但我不明白。我希望用户能够从他们的联系人列表中选择一个联系人,然后他们被带到一个屏幕上,屏幕上有两个按钮:视频通话和语音通话。联系人的电话号码也将显示为顶部的文本视图。他们可以点击任意一个按钮,应用程序将拨打whatsapp电话。我不知道怎样才能得到一个特定联系人的身份证并打电话给他 如果有人能用另一种方式解释,我将非常感激 谢谢我刚刚明白了它的意思,所以我想我会和你们分享这个,以防其他人也感到困惑。如果其中一些错

我想知道如何直接从应用程序拨打whatsapp电话(视频和语音)。我读了这篇文章:但我不明白。我希望用户能够从他们的联系人列表中选择一个联系人,然后他们被带到一个屏幕上,屏幕上有两个按钮:视频通话和语音通话。联系人的电话号码也将显示为顶部的文本视图。他们可以点击任意一个按钮,应用程序将拨打whatsapp电话。我不知道怎样才能得到一个特定联系人的身份证并打电话给他

如果有人能用另一种方式解释,我将非常感激


谢谢

我刚刚明白了它的意思,所以我想我会和你们分享这个,以防其他人也感到困惑。如果其中一些错误不是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,必须使用内容解析器。Contacts contract.Data.CONTENT\u URI从联系人获取数据并将其发送回。通过指定投影,可以进一步减少它所查询的内容。投影是您希望它返回的列,例如联系人的姓名、电话号码。如果将其保留为null,它将不会过滤掉任何数据。这是可选的。如果确实使用投影,请确保包含要返回的以下两列:contacts contract.Data.\u ID,contacts contract.Data.DISPLAY\u NAME,contacts contract.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、显示名称和mimetype存储在3个单独的变量中。它使用游标.getColumnIndex()返回相应的列,然后使用游标.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);
    }

     }

   }
}
您还需要检查mimetype是否为vnd.android.cursor.item/vnd.com.whatsapp.video.call(用于视频通话)或vnd.android.cursor.item/vnd.com.whatsapp.voip.call(用于语音通话) 为此,我使用了一个if语句,如果它是真的,则将其存储到数据库中。光标将遍历每个触点的每个mimetype。因此,它将通过视频呼叫mimetype一次,语音呼叫mimetype一次

然后,为了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);

}

就这样!如果有任何错误或可以解释得更简单的地方,请评论

我做的很多事情都是从一堆不同的帖子、网站和资源中学到的。我不知道这是不是应该的方法,但对我来说很有效。