【问题标题】:Make telegram video call with specific contact with android programmatically以编程方式与特定联系人进行电报视频通话
【发布时间】:2020-12-17 14:50:42
【问题描述】:

我想从我的 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") 这样的东西。

最后有可能吗? 提前致谢

【问题讨论】:

  • "我已经反编译了新的电报 apk" -- 电报是open source。与您更相关的&lt;intent-filter&gt; 似乎是那个下方的那个,它显示了这个活动支持的Web URL。
  • 所以下面这行&lt;data android:mimeType="vnd.android.cursor.item/vnd.org.telegram.messenger.android.call.video"/&gt; 对我来说毫无用处?
  • 仅当您有一个 MIME 类型匹配的Uri。通常,像这样的 MIME 类型来自 ContentProvider 中的条目,而不是来自 Web URL。

标签: android android-intent call telegram mime-types


【解决方案1】:

您需要使用带有 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, null);

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

然后使用这个 contactIDmimeType 来查找 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);
    }
}

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

【讨论】:

  • 是否可以使用相同的逻辑发送消息(通过电话号码,而不是电报用户 ID)?
  • 不,不可能,如果调用它显式打开应用程序,那么消息必须在后台发送。只处理 Telegram API 或 Telegram Bot。也许添加到您的项目电报库 - 'TDLib'。信息:core.telegram.org
猜你喜欢
  • 1970-01-01
  • 2013-05-29
  • 1970-01-01
  • 2013-01-24
  • 2013-10-05
  • 1970-01-01
  • 2018-09-21
  • 1970-01-01
  • 2016-12-26
相关资源
最近更新 更多