2015-05-25 39 views
8

Bir Android TV'den veya Fire TV'den bir cep telefonuna yüklü uygulamaların bir listesini gönderen bir hizmet yapıyorum. Telefon daha sonra başlatmak istediği uygulamanın paket adını geri gönderir ve hizmet başlatır. Bazı uygulamalar için getLaunchIntentForPackage boştur

Bu

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; 
} 

Bu benim Yangın TV herşey üzerinde

public void launchApp(String packageName) { 
    PackageManager pm = getPackageManager(); 
    Intent intent = pm.getLaunchIntentForPackage(packageName); 
    startActivity(intent); 
} 

birçoğu için mükemmel ama Android TV'de niyet çalışır uygulamaları başlatmak nasıl listesini oluşturur koddur uygulamalar her zaman boş. Bunlar sadece birkaçı.

  • com.netflix.ninja
  • aynı kodla Ancak
  • com.bamnetworks.mlbtv

tv.pluto.android com.haystack.android, bu uygulamalar çalışmaları sadece iyi.

  • com.hulu.livingroomplus
  • com.songza.tv
  • com.frogmind.badland
  • com.sling

Herkes ben yapıyor olabilir ne herhangi bir fikir verebilir misiniz yanlış?

Teşekkürler!

DÜZENLEME: Ben de bu denedim ve istisna

android.content.ActivityNotFoundException olsun: Etkinlik Yok Niyet {işlemek için bulunan kedi = [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); 
} 

DÜZENLEME 2:

Bu benim için çalışıyor koddur :

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

Ayı Android TV'de,' LEANBACK_LAUNCHER' başlatıcısı için kategorisidir akılda. Benim tahminim bu uygulamaların bir "LAUNCHER" aktivitesine sahip olmaması ve 'getLaunchIntentForPackage()' ın sadece LEANBACK_LAUNCHER değil, "LAUNCHER" için çalıştığıdır. – CommonsWare

+0

Amaç için paket adını manuel olarak ayarlamayı ve 'android.intent.category.LEANBACK_LAUNCHER' ​​kategorisini eklemeyi denedim, ancak yine de çalışmıyor. Netflix'in bir “LEANBACK_LAUNCHER” ürününe sahip olduğundan emin olduğumu biliyorum. Bu önemliyse, SDK'nın 17-21 sürümlerini hedefliyorum. –

+1

"Amaç için paket adını ayarlamayı denedim ve android.intent.category.LEANBACK_LAUNCHER kategorisini eklemeye çalıştım ama yine de çalışmıyor" - Mevcut kodunuzun bağlamında ne demek istediğini bilmiyorum . Tüm "LEANBACK_LAUNCHER" etkinliklerini bulmak için 'queryIntentActivities()' i kullanmaya davetlisiniz. Bu ("LAUNCHER" ile de olsa), ana ekranların yaptığı şeydir, "getLaunchIntentForPackage()') kullanılmaz. İşte bir örnek ev ekranı tarzı başlatıcısı: https://github.com/commonsguy/cw-omnibus/tree/master/Introspection/Launchalot – CommonsWare

cevap

7

uygulamaları aramak ve daha sonra almak için her Intents başlatmaya çalışmayın, bir ana ekran tarzı başlatıcısı oluşturmak. PackageManager'da queryIntentActivities() kullanarak başlatılabilir etkinliklere bakın. Örneğin

, (this sample project itibaren) bu etkinlik bu tekniği kullanarak bir ana ekran tarzı başlatıcısı uygular: bu ne Android TV bulunuyor olarak bir Android TV cihazında

/*** 
    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)); 
    } 
    } 
} 

, ayrıca, LEANBACK_LAUNCHER faaliyetleri aramalıyız kullanır ve TV'ye özel APK'lar düzenli olarak LAUNCHER etkinliğine sahip olmayabilir veya en iyisi TV'de kullanım için ideal olmayan bir taneye sahip olabilir.o telefonlarda ve tabletlerde olduğu yerine LAUNCHER` `itibariyle

+0

Cevabınızı değiştirmeyi denedim, ama başarısız oldu. Lütfen bir cevap önerebilir misiniz? 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

Kodunuzun ne beklediği hakkında bir açıklama bekleniyor ... –

İlgili konular