1

CATEGORY_HOME インテントを持つすべてのインストール済みパッケージのリストを取得しているという、非常に奇妙な状況に陥っています。

私の意図は、ネイティブ ホーム アプリケーションを手動で起動することです (私のアプリケーションにはその役割があるため、現在は既定のネイティブ ホーム アプリケーションではありません)。

したがって、私が使用している方法 (以下) は、CATEGORY_HOME として設定されている 2 つのアプリがあることを正しく識別します。

私のものを起動しようとすると(ランチャーアクティビティを取得)、正常に動作します。ただし、デフォルトの Launcher アクティビティをフェッチしようとすると、null として返されます。

だから...私は困惑しています。関連する Launch アクティビティをそこからプルしようとすると、ストック ホーム アプリのパッケージ名が null を返す場合、実際に何を起動する必要があるかを判断するにはどうすればよい getLaunchIntentForPackagですか?

これが私がやっていることです(混乱を避けるためにいくつかのコメントを付けて)、記録のために、それらのすべてが名前空間に「android」という表現を持っているわけではないことを知っていますが、これを最初に機能させようとしていますその文字列で戻ってくるデバイスなので、その部分は問題になりません。

            //get a list of all apps that set themselves up as CATEGORY_HOME
    final Intent intent = new Intent(Intent.ACTION_MAIN); 
    intent.addCategory(Intent.CATEGORY_HOME); 
    final List<ResolveInfo> list = ((PackageManager)getPackageManager()).queryIntentActivities(intent, 0);

    String packageName = null;
            //look for the one that has the word android in the package name
    for(ResolveInfo ri : list){

        if(ri.activityInfo.packageName.indexOf("android") != -1)
            //this does get set correctly and looks like "com.sec.android.app.launcher"
            packageName = ri.activityInfo.packageName;
    }

    PackageManager pm = SlidePlayer.this
            .getPackageManager();
    Intent it = pm.getLaunchIntentForPackage(packageName);

    //it is NULL so this doesn't work
            startActivity(it);

***編集

CommonsWare のアドバイスに基づいて、次の方法論を試してみます...

String packageName = null;
    String className = null;
    for(ResolveInfo ri : list){
        //L.d("HOME PACK = " + ri.);
        if(ri.activityInfo.packageName.indexOf("android") != -1){
            className = ri.activityInfo.applicationInfo.className;
            packageName = ri.activityInfo.applicationInfo.packageName;
        }
    }

    //PackageManager pm = SlidePlayer.this
            //.getPackageManager();
    Intent it = new Intent();//pm.getLaunchIntentForPackage(packageName);

            //both packageName and className appear to be set correctly
             //packageName = "com.sec.android.app.launcher"
            //className = "com.android.launcher2.LauncherApplication"
    it.setClassName(packageName, className);
    it.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
    startActivity(it);

EDIT 2 * セミハザー...

1つのデバイス(Samsung Note II)では、キーはコンポーネントを介して設定することです...

     Intent it = new Intent();//pm.getLaunchIntentForPackage(packageName);
ComponentName cn = new ComponentName(packageName, className);
it.setComponent(cn);
//it.setClassName(packageName, className);
it.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(it);

これは、Samsung Tab 10" または Motorola M (これまでにこの方法でテストした唯一の他の 2 つのデバイスです) では機能しません。

4

2 に答える 2

2

getLaucnIntentForPackageCATEGORY_INFO特にまたは--notを探します。このCATEGORY_LAUNCHER場合、 nullCATEGORY_HOMEを返します。ドキュメントから:

public abstract Intent getLaunchIntentForPackage(String packageName)

APIレベル3で追加パッケージ内のフロントドアアクティビティを起動するための「適切な」インテントを返します。たとえば、パッケージを参照するときに「開く」ボタンを実装するために使用します。現在の実装では、最初にカテゴリCATEGORY_INFOのメインアクティビティを検索し、次にカテゴリCATEGORY_LAUNCHERのメインアクティビティを検索するか、どちらも見つからない場合はnullを返します。

于 2013-03-04T00:13:27.163 に答える
1

ただし、デフォルトの Launcher アクティビティをフェッチしようとすると、null として返されます。

これは、ほとんどのファームウェア ホーム画面がホーム画面から起動するように設計されておらず、おそらくランチャー アクティビティが含まれていないためです。

getLaunchIntentForPackag を介して関連する Launch アクティビティをプルしようとすると、ストック ホーム アプリのパッケージ名が null を返す場合、実際に何を起動する必要があるかを判断するにはどうすればよいですか?

ACTION_MAINこれはホーム画面なので、同じ/のアクティビティが必要であることがわかりCATEGORY_HOMEます。それを見つけて始めましょう。

于 2013-03-04T00:17:32.743 に答える