2016-07-29 142 views
5

我想对特定用户进行WhatsApp调用。我想这和它不工作:android-make 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); 
+0

能否请您更新相关错误日志/调试信息您的问题。 –

+0

你把相关的'permissions'加到'manifest'上了吗? – CodeWalker

+0

@LancePreston是的 – israelbenh

回答

11

简单的解决方案是,查询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

现在保存在数据库或其他地方只有那些_ids其MIME类型是vnd.android.cursor.item/vnd.com.whatsapp.voip.call

然后你初始TE 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); 
+0

男人的工作!谢谢!!!!!!! – israelbenh

+0

这真的很有帮助,很棒。非常感谢你。 –

+0

我的两美分,请检查MIME类型的平稳运行。 – Skynet

7

为了使下面的mime-串WhatsApp的视频通话使用

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

为了使下面的mime-串WhatsApp的语音通话使用

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

使用以下代码

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(type)) { 
        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); 
       } 
      } 
     } 
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; 

} 
3

这段代码是检查数量已经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; 
     } 
    } 
+0

下次请检查您的格式。您的帖子质量很差,并且存在缩进问题。 –

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

家伙按照此代码“检查号码有whatsApp”,对于“WhatsApp Call”和“WhatsApp视频通话”试试这个100%,您将得到确切的结果 –

+0

为whtsApp音频和视频通话遵循代码 –