Sto creando un servizio che invia un elenco di app installate da una TV Android o Fire TV a un telefono cellulare. Il telefono invia quindi il nome del pacchetto dell'app che vuole avviare e il servizio lo avvia.getLaunchIntentForPackage è nullo per alcune app
Questo è il codice che crea la lista
public List<InstalledApp> GetInstalledApps(boolean isAndroid) {
PackageManager pm = getPackageManager();
List<ApplicationInfo> allPackages = pm.getInstalledApplications(PackageManager.GET_META_DATA);
List<InstalledApp> userPackages = new ArrayList<InstalledApp>();
for (ApplicationInfo packageInfo : allPackages) {
if (isSystemPackage(packageInfo)) continue;
InstalledApp app = new InstalledApp();
app.setPackageName(packageInfo.packageName);
app.setAppName(pm.getApplicationLabel(packageInfo).toString());
if (!isAndroid) {
app.setIcon(pm.getApplicationIcon(packageInfo));
}
app.setAccentColor(getAccentColor(pm.getApplicationIcon(packageInfo)));
userPackages.add(app);
}
return userPackages;
}
Questo è come io lancio le applicazioni
public void launchApp(String packageName) {
PackageManager pm = getPackageManager();
Intent intent = pm.getLaunchIntentForPackage(packageName);
startActivity(intent);
}
D'tutto Fuoco televisore funziona perfettamente, ma sul televisore Android l'intento per molti di le app sono sempre nulle. Questi sono solo alcuni.
- com.haystack.android
- com.netflix.ninja
- tv.pluto.android
- com.bamnetworks.mlbtv
Tuttavia, con lo stesso codice, queste applicazioni lavoro va bene.
- com.hulu.livingroomplus
- com.sling
- com.frogmind.badland
- com.songza.tv
Qualcuno potrebbe fornire una visione chiara su quello che potrebbe fare sbagliato?
Grazie!
EDIT: Ho anche provato questo e ottengo l'eccezione
android.content.ActivityNotFoundException: trovate attività per gestire Intent {cat = [android.intent.category.LEANBACK_LAUNCHER] FLG = 0x10000000 pkg = com.netflix.ninja}
public void launchApp(String packageName) {
Intent intent = new Intent();
intent.setPackage(packageName);
intent.addCategory("android.intent.category.LEANBACK_LAUNCHER");
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);
}
EDIT 2:
Questo è il codice che funziona per me :
public void launchApp(String packageName) {
Intent intent = new Intent();
intent.setPackage(packageName);
PackageManager pm = getPackageManager();
List<ResolveInfo> resolveInfos = pm.queryIntentActivities(intent, 0);
Collections.sort(resolveInfos, new ResolveInfo.DisplayNameComparator(pm));
if(resolveInfos.size() > 0) {
ResolveInfo launchable = resolveInfos.get(0);
ActivityInfo activity = launchable.activityInfo;
ComponentName name=new ComponentName(activity.applicationInfo.packageName,
activity.name);
Intent i=new Intent(Intent.ACTION_MAIN);
i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK |
Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED);
i.setComponent(name);
startActivity(i);
}
}
Tenere presente che su Android TV, 'LEANBACK_LAUNCHER' è la categoria per il programma di avvio, anziché' LAUNCHER' come è su telefoni e tablet. La mia ipotesi è che quelle applicazioni non abbiano un'attività 'LAUNCHER' e che' getLaunchIntentForPackage() 'funzioni solo per' LAUNCHER', non 'LEANBACK_LAUNCHER'. – CommonsWare
Ho provato manualmente ad impostare il nome del pacchetto per l'intento e ad aggiungere la categoria 'android.intent.category.LEANBACK_LAUNCHER' ma ancora non funziona. So per certo che Netflix ha un 'LEANBACK_LAUNCHER'. Sto prendendo di mira le versioni dell'SDK 17-21 se questo è importante. –
"Ho provato a impostare il nome del pacchetto per l'intento e ad aggiungere una categoria android.intent.category.LEANBACK_LAUNCHER ma ancora non funziona" - Non so cosa intendi con quello nel contesto del tuo codice esistente . Siete liberi di utilizzare 'queryIntentActivities()' per trovare tutte le attività 'LEANBACK_LAUNCHER'. Questo (anche se con 'LAUNCHER') è quello che fanno gli schermi domestici, non usare' getLaunchIntentForPackage() '). Ecco un esempio di avvio in stile schermata di esempio: https://github.com/commonsguy/cw-omnibus/tree/master/Introspection/Launchalot – CommonsWare