Android намерен играть видео?

Я пытаюсь воспроизвести видео на Android, запустив намерение. Код, который я использую:

tostart = new Intent(Intent.ACTION_VIEW);
tostart.setDataAndType(Uri.parse(movieurl), "video/*");
startActivity(tostart); 

Это работает на большинстве телефонов, но не на HTC Hero. Кажется, он загружает немного другой видеоплеер. Это действительно первое видео, брошенное на него. Тем не менее, каждое видео после этого не отвечает. (он держится в некотором цикле).

Если я добавлю явный

tostart.setClassName("com.htc.album","com.htc.album.ViewVideo");

(до начала работы) он работает на HTC Hero. Однако, поскольку это специальный вызов HTC, я не могу запустить этот код на других телефонах (например, G1). На G1 это работает:

tostart.setClassName("com.android.camera","com.android.camera.MovieView"); //g1 version

Но это намерение отсутствует у героя. Кто-нибудь знает список намерений/классных имен, которые должны поддерживаться всеми устройствами Android? Или конкретный для запуска видео? Спасибо!

Ответ 1

Используйте setDataAndType в намерении

Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(newVideoPath));
intent.setDataAndType(Uri.parse(newVideoPath), "video/mp4");
startActivity(intent);

Используйте "video/mp4" в качестве MIME или используйте "video/*", если вы не знаете тип.

Ответ 2

Я столкнулся с этим с Героем, используя то, что, как я думал, был опубликованным API. В конце концов, я использовал тест, чтобы узнать, можно ли получить намерение:

private boolean isCallable(Intent intent) {
    List<ResolveInfo> list = getPackageManager().queryIntentActivities(intent, 
        PackageManager.MATCH_DEFAULT_ONLY);
    return list.size() > 0;
}

При использовании, когда обычно я начинаю свою деятельность:

final Intent intent = new Intent("com.android.camera.action.CROP");
intent.setClassName("com.android.camera", "com.android.camera.CropImage");
if (isCallable(intent)) {
    // call the intent as you intended.
} else {
    // make alternative arrangements.
}

Очевидно: если вы спуститесь по этому маршруту - используя непубличные API-интерфейсы, вы должны абсолютно обеспечить резерв, который, как вы знаете, определенно работает. Это не должно быть совершенным, это может быть тост, говорящий, что это неподдерживается для этого телефона/устройства, но вы должны избегать неперехваченного исключения. очевидно.


Я нахожу Open Intents Registry of Intents Protocols весьма полезным, но я не нашел эквивалент списка типов TCK, который абсолютно необходимо поддерживать, и примеры того, какие приложения используют разные трубки.

Ответ 3

следующий код работает отлично для меня.

Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(movieurl));
startActivity(intent);

Ответ 4

из отладочной информации, кажется, что VideoIntent из MainActivity не может отправить путь видео к VideoActivity. Он дает ошибку NullPointerException из uriString. Я думаю, что некоторые из этого кода из VideoActivity:

Intent myIntent = getIntent();
String uri = myIntent.getStringExtra("uri");
Bundle b = myIntent.getExtras();

startVideo(b.getString(uri));

Не удается получить uri отсюда:

public void playsquirrelmp4(View v) {
    Intent VideoIntent = (new Intent(this, VideoActivity.class));
    VideoIntent.putExtra("android.resource://" + getPackageName()
        + "/"+   R.raw.squirrel, uri);
    startActivity(VideoIntent);
}