Сделайте видеовызов Telegram с определенным контактом с Android программно

#android #android-intent #call #telegram #mime-types

#Android #android-намерение #вызов #telegram #mime-типы

Вопрос:

Я хочу запустить видеовызов Telegram из своего приложения для Android, поэтому я декомпилировал новый apk-файл Telegram, чтобы найти следующее:

  <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") .

Возможно ли это в конце? Заранее спасибо

Комментарии:

1. «Я декомпилировал новый telegram apk» — Telegram имеет открытый исходный код . Более актуальным <intent-filter> для вас будет тот, который ниже, который показывает, какие веб-адреса поддерживает это действие.

2. Итак, следующая строка <data android:mimeType="vnd.android.cursor.item/vnd.org.telegram.messenger.android.call.video"/> бесполезна для меня в моих намерениях?

3. Только если у вас есть, Uri чей MIME-тип соответствует. Обычно подобный тип MIME поступает из записи в ContentProvider , а не из веб-URL.

Ответ №1:

Вам нужно использовать URI ContactID с типом mimeType, который является «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;
}
  

затем используйте этот 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;
}
  

после чего используйте намерение.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);
    }
}
  

Было бы неплохо добавить проверку установленного «Telegram», а также того, разрешил ли пользователь видеовызов.

Комментарии:

1. Возможно ли отправить сообщение, используя ту же логику (по номеру телефона, а не по идентификатору пользователя Telegram)?

2. Нет, это невозможно, если вызов этого явно открывает приложение, тогда сообщение должно быть отправлено в фоновом режиме. Разбирайтесь только с Telegram API или Telegram Bot. Возможно, добавьте в свой проект библиотеку Telegram — ‘TDLib’ . информация: core.telegram.org