【问题标题】:Making a WhatsApp voice/video call进行 WhatsApp 语音/视频通话
【发布时间】:2019-03-23 09:00:05
【问题描述】:

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

如果有人能用另一种方式解释,我将不胜感激。

谢谢

【问题讨论】:

    标签: android whatsapp


    【解决方案1】:

    我刚刚弄清楚它的含义,所以我想我会与你们分享这个,以防其他人也感到困惑。如果其中一些不是 100% 正确,请致歉。

    要发送 whatsapp 通话/视频通话,您需要获取联系人的 ID。不只是任何 ID,具有适合 whatsapp 的特定 mimetype 的 ID。这些 mimetype 是 vnd.android.cursor.item/vnd.com.whatsapp.video.callvnd.android.cursor.item/vnd.com.whatsapp.voip.call em>

    要查询 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、显示名称和 mimetype 存储在 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);
        }
    
         }
    
       }
    }
    

    您还需要检查 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);
    
    }
    

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

    【讨论】:

    • 我所做的很多事情都是从一堆不同的帖子、网站和资源中学到的。我不知道这是否是应该的方式,但它对我有用。
    猜你喜欢
    • 2019-10-01
    • 1970-01-01
    • 2020-09-04
    • 2022-11-07
    • 1970-01-01
    • 2021-01-15
    • 1970-01-01
    • 1970-01-01
    • 2020-09-12
    相关资源
    最近更新 更多