2015-05-25 21 views
8

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

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

+0

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. –

+1

"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

Odpowiedz

7

Aby utworzyć wyrzutni domu ekran stylu, nie patrz na aplikacje, a następnie postarać się o uruchomienie Intents dla każdego. Poszukaj możliwych do uruchomienia działań, używając queryIntentActivities() na PackageManager.

Na przykład, ta aktywność (od this sample project) realizuje wyrzutnię Ekran stylu przy użyciu tej techniki:

/*** 
    Copyright (c) 2008-2012 CommonsWare, LLC 
    Licensed under the Apache License, Version 2.0 (the "License"); you may not 
    use this file except in compliance with the License. You may obtain a copy 
    of the License at http://www.apache.org/licenses/LICENSE-2.0. Unless required 
    by applicable law or agreed to in writing, software distributed under the 
    License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS 
    OF ANY KIND, either express or implied. See the License for the specific 
    language governing permissions and limitations under the License. 

    From _The Busy Coder's Guide to Android Development_ 
    http://commonsware.com/Android 
*/ 

package com.commonsware.android.launchalot; 

import android.app.ListActivity; 
import android.content.ComponentName; 
import android.content.Intent; 
import android.content.pm.ActivityInfo; 
import android.content.pm.PackageManager; 
import android.content.pm.ResolveInfo; 
import android.os.Bundle; 
import android.view.View; 
import android.view.ViewGroup; 
import android.widget.ArrayAdapter; 
import android.widget.ImageView; 
import android.widget.ListView; 
import android.widget.TextView; 
import java.util.Collections; 
import java.util.List; 

public class Launchalot extends ListActivity { 
    AppAdapter adapter=null; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 

    PackageManager pm=getPackageManager(); 
    Intent main=new Intent(Intent.ACTION_MAIN, null); 

    main.addCategory(Intent.CATEGORY_LAUNCHER); 

    List<ResolveInfo> launchables=pm.queryIntentActivities(main, 0); 

    Collections.sort(launchables, 
        new ResolveInfo.DisplayNameComparator(pm)); 

    adapter=new AppAdapter(pm, launchables); 
    setListAdapter(adapter); 
    } 

    @Override 
    protected void onListItemClick(ListView l, View v, 
           int position, long id) { 
    ResolveInfo launchable=adapter.getItem(position); 
    ActivityInfo activity=launchable.activityInfo; 
    ComponentName name=new ComponentName(activity.applicationInfo.packageName, 
             activity.name); 
    Intent i=new Intent(Intent.ACTION_MAIN); 

    i.addCategory(Intent.CATEGORY_LAUNCHER); 
    i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | 
       Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED); 
    i.setComponent(name); 

    startActivity(i);  
    } 

    class AppAdapter extends ArrayAdapter<ResolveInfo> { 
    private PackageManager pm=null; 

    AppAdapter(PackageManager pm, List<ResolveInfo> apps) { 
     super(Launchalot.this, R.layout.row, apps); 
     this.pm=pm; 
    } 

    @Override 
    public View getView(int position, View convertView, 
          ViewGroup parent) { 
     if (convertView==null) { 
     convertView=newView(parent); 
     } 

     bindView(position, convertView); 

     return(convertView); 
    } 

    private View newView(ViewGroup parent) { 
     return(getLayoutInflater().inflate(R.layout.row, parent, false)); 
    } 

    private void bindView(int position, View row) { 
     TextView label=(TextView)row.findViewById(R.id.label); 

     label.setText(getItem(position).loadLabel(pm)); 

     ImageView icon=(ImageView)row.findViewById(R.id.icon); 

     icon.setImageDrawable(getItem(position).loadIcon(pm)); 
    } 
    } 
} 

Na urządzeniu z systemem Android TV, należy również szukać LEANBACK_LAUNCHER działań, jako że to właśnie TV Android zastosowań, a pakiety APK specyficzne dla telewizji mogą nie mieć regularnej aktywności LAUNCHER lub w najlepszym wypadku mieć taką, która niekoniecznie jest idealna do użycia na telewizorze.

+0

Próbowałem zmodyfikować twoją odpowiedź tutaj, ale to się nie udało. Czy możesz zaproponować odpowiedź? http://stackoverflow.com/questions/38856092/why-doesnt-ui-automator-launch-activity – likejiujitsu

0
Intent launchIntent = null; 

       try{ 
         launchIntent = context.getPackageManager().getLeanbackLaunchIntentForPackage(pkgName); 
        } catch (java.lang.NoSuchMethodError e){ 
        } 

        if (launchIntent == null) launchIntent = context.getPackageManager().getLaunchIntentForPackage(pkgName); 

       if (launchIntent != null) { 
        launchIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
        context.startActivity(launchIntent); 
       } else { 
        // failure message 
       } 
+0

Wymagane jest wyjaśnienie, co robi Twój kod ... –

Powiązane problemy