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");
or 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”。通过电话号码查找第一个联系人ID:
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;
}
然后使用这个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);
}
}
最好为已安装的“电报”添加检查,以及用户是否允许视频通话。
推荐阅读
- laravel - 如何在laravel上获取第一张图片
- javascript - Angular Universal 错误 ReferenceError:未定义 MouseEvent
- angular - 在Angular中向下滚动时如何使组件消失?
- delphi - 如何在设计时设置应用程序字体?
- excel - 如何计算一个范围内的唯一文本值,并给出一些约束?
- python - 使用 Python matplotlib 以列表的形式绘制两个变量函数
- debugging - CLion 调试:lldb 附加到进程,断点为灰色,表示没有可执行文件
- xml - 遇到特定节点时将节点内容一分为二
- r - 在 Latex (Sweave) 文档中引用 R 对象?
- javascript - document.querySelector 处理多个值