通过编程方式与Android进行特定联系人的电报视频通话

问题描述

我想从我的android应用程序内发起电报视频通话,因此我已经反编译了新的电报apk以查找以下内容:

 <intent-filter>
                <action
                    android:name="android.intent.action.VIEW" />
                <category
                    android:name="android.intent.category.DEFAULT" />
                <data
                    android:mimeType="vnd.android.cursor.item/vnd.org.telegram.messenger.android.profile" />
                <data
                    android:mimeType="vnd.android.cursor.item/vnd.org.telegram.messenger.android.call" />
                <data
                    android:mimeType="vnd.android.cursor.item/vnd.org.telegram.messenger.android.call.video" />
            </intent-filter>

有一些与call.video相关的内容,但是我不知道如何在代码中使用此data元素,我唯一的尝试是执行以下操作:

Intent telegram = new Intent(Intent.ACTION_VIEW,Uri.parse("https://telegram.me/"+contact));
        startActivity(telegram);

我希望有类似telegram.setType("video");telegram.setType("vnd.android.cursor.item/vnd.org.telegram.messenger.android.call.video")的东西。

最后有可能吗? 预先感谢

解决方法

您需要使用带有mimeType的URI contactID,即“ vnd.android.cursor.item / vnd.org.telegram.messenger.android.call.video”。通过电话号码查找第一个 contactID

private String getContactIdByPhoneNumber(String phoneNumber) {
    ContentResolver contentResolver = getContentResolver();
    String contactId = null;
    Uri uri = Uri.withAppendedPath(ContactsContract.PhoneLookup.CONTENT_FILTER_URI,Uri.encode(phoneNumber));
    String[] projection = new String[]{ContactsContract.PhoneLookup._ID};
    Cursor cursor = contentResolver.query(uri,projection,null,null);

    if (cursor != null) {
        while (cursor.moveToNext()) {
            contactId = cursor.getString(cursor.getColumnIndexOrThrow(ContactsContract.PhoneLookup._ID));
        }
        cursor.close();
    }
    return contactId;
}

然后使用此 contactID mimeType 查找URI:

private Uri getUriFromPhoneNumber(String phoneNumber) {
    Uri uri = null;
    String contactId = getContactIdByPhoneNumber(phoneNumber);
    String mimeTypeTelegram = "vnd.android.cursor.item/vnd.org.telegram.messenger.android.call.video";
    Cursor cursorTelegram = getContentResolver().query(
            ContactsContract.Data.CONTENT_URI,new String[]{ContactsContract.Data._ID},ContactsContract.Data.CONTACT_ID + "=? AND " + ContactsContract.Data.MIMETYPE + "=?",new String[]{contactId,mimeTypeTelegram},null);
    if (cursorTelegram != null) {
        while (cursorTelegram.moveToNext()) {
            String id = cursorTelegram.getString(cursorTelegram.getColumnIndexOrThrow(ContactsContract.Data._ID));
            if (!TextUtils.isEmpty(id)) {
                uri = Uri.parse(ContactsContract.Data.CONTENT_URI + "/" + id);
                break;
            }
        }
        cursorTelegram.close();
    }
    return uri;
}

之后使用 Intent.ACTION_VIEW

public void videoCallToTelegramContact(String phoneNumber) {
    Uri uri = getUriFromPhoneNumber(phoneNumber);
    Log.d(TAG,uri + "");
    if (uri != null) {
        Intent intent = new Intent(Intent.ACTION_VIEW);
        intent.setData(uri);
        intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        startActivity(intent);
    }
}

最好为已安装的“电报”添加检查,以及用户是否允许视频通话。

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...