Как предотвратить «полное действие, используя» диалоговое окно в приложении Android - PullRequest
1 голос
/ 03 августа 2011

Я играю видео на YouTube в приложении для Android, используя код
startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse(youtube_video_url)));
, когда я пытаюсь воспроизвести видео на устройстве, появляется диалоговое окно «Выполнить действие с помощью» с параметрами Интернет и YouTube.Как я могу предотвратить это всплывающее окно и открыть видео YouTube прямо в плеере YouTube.Более того, есть ли способ воспроизвести видео YouTube непосредственно в видеоплеере (избегая проигрывателя YouTube), как это делает Engadget.

1 Ответ

0 голосов
/ 03 августа 2011

Вот то WatchActivity, которое вы хотите вызвать

<activity android:name="WatchActivity" android:screenOrientation="sensor" android:configChanges="keyboardHidden|orientation" android:allowTaskReparenting="true">
    <intent-filter>
        <action android:name="android.intent.action.VIEW" />
        <category android:name="android.intent.category.DEFAULT" />
        <category android:name="android.intent.category.BROWSABLE" />
        <data android:scheme="http" android:host="www.youtube.com" android:pathPrefix="/watch" />
    </intent-filter>
    <intent-filter>
        <action android:name="android.intent.action.VIEW" />
        <category android:name="android.intent.category.DEFAULT" />
        <category android:name="android.intent.category.BROWSABLE" />
        <data android:scheme="http" android:host="www.youtube.com" android:pathPrefix="/v/" />
    </intent-filter>
    <intent-filter>
        <action android:name="android.intent.action.VIEW" />
        <category android:name="android.intent.category.DEFAULT" />
        <category android:name="android.intent.category.BROWSABLE" />
        <data android:scheme="http" android:host="www.youtube.com" android:pathPrefix="/e/" />
    </intent-filter>
    <intent-filter>
        <action android:name="android.intent.action.VIEW" />
        <category android:name="android.intent.category.DEFAULT" />
        <category android:name="android.intent.category.BROWSABLE" />
        <data android:scheme="vnd.youtube" />
    </intent-filter>
</activity>

Это не действие по умолчанию, то есть, чтобы вызвать его напрямую, вам нужно попробовать следующий код

String youtubePackage = "com.google.android.youtube";
ArrayList<IntentFilter> intentFilters = new ArrayList<IntentFilter>();
/*
 * Filter to match
    <intent-filter>
        <action android:name="android.intent.action.VIEW" />
        <category android:name="android.intent.category.DEFAULT" />
        <category android:name="android.intent.category.BROWSABLE" />
        <data android:scheme="http" android:host="www.youtube.com" android:pathPrefix="/watch" />
    </intent-filter>
 */
IntentFilter filter = new IntentFilter();
filter.addAction(Intent.ACTION_VIEW);
filter.addCategory(Intent.CATEGORY_DEFAULT);
filter.addCategory(Intent.CATEGORY_BROWSABLE);
//filter.addDataScheme("http");
//filter.addDataAuthority("www.youtube.com", null);//port null will allow any port
//filter.addDataPath("/watch", PatternMatcher.PATTERN_PREFIX);
intentFilters.add(filter);
ArrayList<ComponentName> outActivities = new ArrayList<ComponentName>();
getPackageManager().getPreferredActivities(intentFilters, outActivities, youtubePackage);

После последнего вызова переменная outActivities будет содержать совпадающие действия (скорее всего, только одно). На самом деле, это ничего не возвращает для меня.

Чтобы убедиться, что Activity s соответствует вашему Intent, вы можете запросить пакет

Intent videoIntent = new Intent(Intent.ACTION_VIEW, Uri.parse("http://m.youtube.com/watch?v=EUXnJraKM3k"));         
List<ResolveInfo> matchingActivities = getPackageManager().queryIntentActivities(videoIntent, PackageManager.MATCH_DEFAULT_ONLY);

Или откажитесь от всей этой длинной процедуры и просто продолжайте с

Intent videoIntent = new Intent(Intent.ACTION_VIEW, Uri.parse("vnd.youtube:<video id>"));
startActivity(videoIntent);

vnd.youtube - схема, принятая фильтром WatchActivity, как вы видите.

...