Buduję usługę, która wysyła listę zainstalowanych aplikacji z Android TV lub Fire TV na telefon komórkowy. Następnie telefon odsyła nazwę pakietu aplikacji, którą chce uruchomić, a usługa uruchamia ją.getLaunchIntentForPackage ma wartość null dla niektórych aplikacji
Jest to kod, który tworzy listę
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;
}
To jak ja uruchomić aplikacje
public void launchApp(String packageName) {
PackageManager pm = getPackageManager();
Intent intent = pm.getLaunchIntentForPackage(packageName);
startActivity(intent);
}
Na wszystko Ogień TV działa idealnie, ale na Android TV intencję dla wielu aplikacje zawsze mają wartość zerową. To tylko kilka.
- com.haystack.android
- com.netflix.ninja
- tv.pluto.android
- com.bamnetworks.mlbtv
jednak z tym samym kodem, te aplikacje praca w porządku.
- com.hulu.livingroomplus
- com.sling
- com.frogmind.badland
- com.songza.tv
Czy ktoś zapewniają żadnego wglądu w to, co mógłbym robić źle?
Dzięki!
EDIT: Próbowałem też to i dostaję wyjątkiem
android.content.ActivityNotFoundException: Nie stwierdzono aktywny uchwyt 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:
jest to kod, który działa dla mnie :
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);
}
}
Należy pamiętać, że na Android TV, 'LEANBACK_LAUNCHER' jest kategoria dla wyrzutni, zamiast' LAUNCHER' jak to jest na telefonach i tabletach. Domyślam się, że te aplikacje nie mają aktywności "LAUNCHER" i że 'getLaunchIntentForPackage()' działa tylko dla 'LAUNCHER', a nie' LEANBACK_LAUNCHER'. – CommonsWare
Próbowałem ręcznie ustawić nazwę pakietu dla intencji i dodanie kategorii "android.intent.category.LEANBACK_LAUNCHER", ale nadal nie działa. Wiem na pewno, że Netflix ma "LEANBACK_LAUNCHER". Wybieram wersję SDK 17-21, jeśli to ma znaczenie. –
"Próbowałem ustawić nazwę pakietu dla intencji i dodanie kategorii android.intent.category.LEANBACK_LAUNCHER, ale nadal nie działa" - nie wiem, co masz na myśli przez to w kontekście istniejącego kodu . Możesz użyć 'queryIntentActivities()', aby znaleźć wszystkie działania 'LEANBACK_LAUNCHER'. Że (choć z 'LAUNCHER') to, co robią ekrany główne, nie używaj' getLaunchIntentForPackage() '). Oto przykładowy program startowy w stylu ekranu głównego: https://github.com/commonsguy/cw-omnibus/tree/master/Introspection/Launchalot – CommonsWare