6

を使用してアプリケーションのカテゴリを取得する方法:私は</p> <pre><code><category android:name="com.myapp.MY_CATEGORY"/> </code></pre> <p>のように私の指定されたカテゴリを有する2つ以上のアプリケーションを持っていると私がすることで、このカテゴリを持つすべてのパッケージを取得することができていますパッケージ名

final Intent mainIntent = new Intent(Intent.ACTION_MAIN, null); 
mainIntent.addCategory("com.myapp.MY_CATEGORY"); 
final List<ResolveInfo> pkgAppsList =getPackageManager().queryIntentActivities(mainIntent, 0); 

今、カテゴリアプリケーションのインストールとアプリケーションからの削除を追跡したいので、インストールされているアプリケーションや削除されたアプリケーションのパッケージ名を与えるブロードキャストレシーバーを作成しましたが、パッケージ名を使用してアプリケーションのカテゴリをゲートしてこれは私のアプリかどうかです。私は特定のカテゴリのアプリケーションのための放送受信機を作ることができますか、もし私がどのようにカテゴリをpackagenameから得ることができないのですか?

+0

解決方法はありましたか? –

+0

どのようにしてプログラムのカテゴリをどのように取得できますか? –

+0

@ Sam-In-TechValensでは、パッケージ名を使用してカテゴリを取得することはできません。カテゴリを使用してパッケージ名を抽出するだけです。だから私は放送でやったことは、パッケージをインストールし、arraylistで定義されたカテゴリを使用してすべてのパッケージを取り出し、インストールされている最新のパッケージとのマッチングは、インストールされているアプリケーションが今自分のアプリケーションであることを意味します。 – pyus13

答えて

-1

別のアプローチを使用することもできます。カテゴリをアクティビティに設定するのではなく、アプリケーションマニフェストにメタ情報を設定します。 (アプリケーションがフラグDONT_DELETE_DATAで削除されていない場合)パッケージ情報を削除した 注

<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
    package="your.package.name" 
    android:versionCode="1" 
    android:versionName="1" > 

    <application 
     android:icon="@drawable/ic_launcher" 
     android:label="@string/app_name"> 
     <meta-data 
      android:name="meta-name" 
      android:value="meta-value" /> 
    </application> 
</manifest> 

もう取得できないパッケージのインストールを追跡するために、放送受信機を追加します。パッケージのメタ情報を確認して、あなたの価値が既にあることを確認してください。

private BroadcastReceiver packageListener = new BroadcastReceiver() { 
    public void onReceive(Context context, Intent intent) { 

     Log.i(intent.getAction(), intent.getData().getEncodedSchemeSpecificPart()); 

     //Currently being installed or deleted package 
     String packageName = intent.getData().getEncodedSchemeSpecificPart(); 

     Object value = null;    
     try { 
      ApplicationInfo appInfo = getPackageManager().getApplicationInfo(packageName,PackageManager.GET_META_DATA); 

      //Get meta value if exits 
      value = appInfo.metaData.get("meta-name"); 
     } catch (NameNotFoundException e) { 
      Log.e(TAG, "exception occured", e);    
     } 
     //check meta info if it is yours   
} 
} 

あなたはそれがあなた自身のアプリケーションを認識するための安全な方法ではありませんので、他のアプリケーションはそのマニフェストであなたのメタデータを設定することができることを見るように。最善の方法は、すべてが同じ証明書で署名されている場合、apkの署名をチェックすることです。

private BroadcastReceiver packageListener = new BroadcastReceiver() { 

    public void onReceive(Context context, Intent intent) { 

     Log.i(intent.getAction(), intent.getData().getEncodedSchemeSpecificPart()); 

     String packageName = intent.getData().getEncodedSchemeSpecificPart(); 

     Signature[] signatures = null; 
     try { 
      PackageInfo packageInfo = getPackageManager().getPackageInfo(packageName,PackageManager.GET_SIGNATURES); 

      signatures = packageInfo.signatures; 

     } catch (NameNotFoundException e) { 
      Log.e(TAG, "exception occured", e); 
     } 

     //check installed package signature if it matches 
    } 
} 
+0

ありがとうございます。私はこれを試し、それが私のためにうまくいくかどうかを知らせます。 – pyus13

+0

値にもシグネチャ変数にも情報はありません –

関連する問題

 関連する問題