2011-01-03 5 views
5

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

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

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

Я пробовал этот код, который должен получить список пакетов, которые поддерживают намерение. Он работает для некоторых вещей, таких как «application/pdf» и «video/*». Когда я пытаюсь сделать это с помощью «audio/*», я получаю пустой список, хотя у меня есть и Android-плеер 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); 

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

+0

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

+0

OK Я думаю, что у меня это работает. Я отправлю решение, когда получу его. – Bob

+0

Это может также работать для вас: http://stackoverflow.com/questions/18161237/list-installed-media-players-android/21658150#21658150 – yado

ответ

6

OK Вот как я прошу ОС указать список установленных аудиоплееров.

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 не имеет звука. Я пробовал этот код сразу после перезагрузки, и он работает. Я не пробовал его на телефоне без каких-либо пользовательских носителей.

+0

Я пробовал ур код, он получает медиа-плеер, есть ли какой-либо код для доступа к списку файлов аудио и vedio-файлов в устройстве. –

+0

Привет, Боб, как вы показываете список приложений? спасибо – Ivan

+0

@Bob: это дает мне «W/ContentResolver: не удалось получить тип для: content: // media/external/audio/media/1 (Неизвестный URL: content: // media/external/audio/media/1) 'ошибка при выполнении ... Требуется ли какое-либо разрешение для добавления в AndroidManifest.xml? – Kushal

2
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); 

Вот мое решение, если вы хотите получить список «видео/» или «аудио/» АРР, вы должны использовать «setDataAndType»; Но если вы хотите получить список «text/*» или «pdf» APP, вы можете использовать «setType».

0
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); 

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

+1

было бы неплохо указать, почему вы думаете, что это лучше. – Dreamwalker

0

Для моего 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(); 
3

/* Для моего Samsung Galaxy S4 работает андроид версии 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(); 
+1

Это единственное решение, которое работает для меня и на новых телефонах! – pivu0

0
/** 
    * 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; 
    } 
Смежные вопросы