Как получить список установленных медиаплееров - PullRequest
6 голосов
/ 03 января 2011

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

Насколько я понимаю, в Android нет медиаплеера по умолчанию.У меня есть оригинальный Droid, и у него есть медиаплеер, но я понимаю, что другие операторы используют свои собственные, или пользователь может удалить стандартный.

Я пробовал несколько вещей, но не могу заставить что-либо работать.

Я попробовал этот код, который должен получить список пакетов, которые поддерживают намерение.Это работает для некоторых вещей, таких как «application / pdf» и «video / *».Когда я пытаюсь сделать это с «audio / *», я получаю пустой список, хотя у меня установлены как стандартный Android-медиаплеер, так и MixZing.Также попробовал его с «media / *» и ничего не получил.

PackageManager packageManager = getPackageManager();
Intent testIntent = new Intent(Intent.ACTION_VIEW);
testIntent.setType("audio/*");
List list = packageManager.queryIntentActivities(testIntent, 0);

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

Intent i = new Intent(Intent.ACTION_VIEW);
Uri u = Uri.withAppendedPath(MediaStore.Audio.Media.INTERNAL_CONTENT_URI,"1"); 
i.setData(u); 
startActivity(i); 

Единственное, что я могу сделать, это выйти и получить имена пакетов наиболеепопулярные медиаплееры и жестко их кодировать и искать в телефоне, чтобы увидеть, какие из них установлены, но это не лучший подход.Я не понимаю, почему первый бит кода не работает.Возможно, фильтры намерений не установлены должным образом для этих приложений, или я использую неправильный код или типы пантомимы.

Ответы [ 6 ]

6 голосов
/ 05 января 2011

ОК, вот как я прошу у ОС список установленных аудиоплееров.

Intent intent = new Intent(Intent.ACTION_VIEW);
Uri uri = Uri.withAppendedPath(MediaStore.Audio.Media.INTERNAL_CONTENT_URI,"1"); 
intent.setData(uri);
List<ResolveInfo> playerList;
playerList = packageManager.queryIntentActivities(intent, 0);

playerList будет заполнен объектами ResolveInfo для каждого приложения на телефоне, которое утверждает, что обрабатывает звук. Из ResolveInfo вы можете получить такие вещи, как имя пакета для запуска действия, вы можете получить значки и названия приложений. Я использую его для заполнения настраиваемого диалогового окна, которое выглядит и действует как стандартное диалоговое окно Android для выбора действия для запуска. У меня также есть возможность для пользователя установить выбранное приложение по умолчанию.

Это не идеально. Вы находитесь во власти ОС и фильтров intent приложения. Я пробовал это на нескольких телефонах, и следующие приложения отображаются правильно: стандартный медиа-плеер для оригинального Droid, стандартный медиа-плеер для телефонов HTC, doubleTwist и MixZing. Тем не менее, я установил Zimly, и он не появляется. Я подозреваю, что их фильтры намерений не настроены для аудио.

Я также волновался, что могут быть случаи, когда MediaStore.Audio.Media.INTERNAL_CONTENT_URI не имеет звука. Я попробовал этот код сразу после перезагрузки, и он работает. Я не пробовал его на телефоне без установленного пользовательского носителя.

3 голосов
/ 21 мая 2016

/ * Для моего samsung galaxy s4 под управлением Android версии 5.0 ни одно из приведенных выше решений не работает, но я нашел другое решение.Работает отлично.Вот код для кого-то, кому может понадобиться помощь.* /

Intent intent = new Intent(Intent.ACTION_VIEW);
intent.setDataAndType(Uri.fromFile(new File("content://media/internal/audio/media")), "audio/*");
List activities = this.getPackageManager().queryIntentActivities(intent, 0);
List activities; activities = getPackageManager().queryIntentActivities(intent, 0); int count = activities.size(); String a = Integer.toString(count);

//set alert for executing the task
AlertDialog.Builder builder1 = new AlertDialog.Builder(this);
builder1.setMessage("Handle: " + a);
builder1.setCancelable(true);

AlertDialog alert11 = builder1.create();
alert11.show(); 
3 голосов
/ 09 февраля 2015
Intent resolveIntent = new Intent(Intent.ACTION_VIEW);
if (type.startsWith("audio/*")) {
    Uri uri = Uri.withAppendedPath(
            MediaStore.Audio.Media.INTERNAL_CONTENT_URI, "1");
    resolveIntent.setDataAndType(uri, type);
} else if (type.startsWith("video/*")) {
    Uri uri = Uri.withAppendedPath(
            MediaStore.Video.Media.INTERNAL_CONTENT_URI, "1");
    resolveIntent.setDataAndType(uri, type);
} else if (type.startsWith("application/pdf")) {
    resolveIntent.setType(type);
}

List<ResolveInfo> pkgAppsList = mContext.getPackageManager().queryIntentActivities(resolveIntent, PackageManager.GET_RESOLVED_FILTER);

Вот мое решение. Если вы хотите получить список приложений "video / " или "audio / ", вы должны использовать "setDataAndType";Но если вы хотите получить список приложений "text / *" или "pdf", вы можете использовать "setType".

0 голосов
/ 21 ноября 2016
/** 
     * get apps supporting video playing
     * @return 
     */  
    private List<String> queryPlayerPackageNameLst()  
    {         
        Intent intent = new Intent(Intent.ACTION_VIEW);  
        intent.setDataAndType(Uri.parse(video), "video/*");  

        PackageManager pm = getPackageManager();  

        List<ResolveInfo> infos = pm.queryIntentActivities(intent,PackageManager.MATCH_UNINSTALLED_PACKAGES);  

        List<String> packageNameLst = null;  

        if (infos != null && infos.size() > 0)  
        {  
            packageNameLst = new ArrayList<String>(infos.size());  

            for(int i=0; i<infos.size(); i++)  
            {  
                ResolveInfo info = infos.get(i);  

                packageNameLst.add(info.activityInfo.packageName);  
                //info.activityInfo.name  
            }  
        }  

        return packageNameLst;  
    }  
0 голосов
/ 21 мая 2016

Для моего Samsung Galaxy S4 под управлением Android версии 5.0 ни одно из вышеуказанных решений не работает, но я нашел другое решение. Работает отлично. Вот код для кого-то, кому может понадобиться помощь.

    Intent intent = new Intent(Intent.ACTION_VIEW);
    intent.setDataAndType(Uri.fromFile(new File("content://media/internal/audio/media")), "audio/*");
    List<ResolveInfo> activities = this.getPackageManager().queryIntentActivities(intent, 0);
    // content://media/internal/audio/media
    //List<ResolveInfo> activities;
    activities = getPackageManager().queryIntentActivities(intent, 0);
    int count = activities.size();
    String a = Integer.toString(count);

    //set alert for executing the task
    AlertDialog.Builder builder1 = new AlertDialog.Builder(this);
    builder1.setMessage("Handle: " + a);
    builder1.setCancelable(true);

    AlertDialog alert11 = builder1.create();
    alert11.show(); 
0 голосов
/ 13 февраля 2015
Intent resolveIntent = new Intent(Intent.ACTION_VIEW);
resolveIntent.setDataAndType(Uri.parse("file://"), MIMEType);
List<ResolveInfo> pkgAppsList = mContext.getPackageManager().queryIntentActivities(resolveIntent, PackageManager.MATCH_DEFAULT_ONLY| PackageManager.GET_RESOLVED_FILTER);

Я думаю, что это лучше!

...