5

Android アプリケーションがプリインストールされます。そして、プリインストールされたアプリを追跡したいと考えています。

この目的のために、何らかの方法でキーまたはフラグを保存する必要があります (つまり、アプリがプリインストールされていることを意味します)。このキーをバックエンドへの各リクエストに追加し、分析します。私はそれに問題があります。問題は、Google Play からのアップデートに関するものです。

標準的なワークフローは次のとおりです。

1) 私はメーカーに私のアプリケーションの特別なバージョンを渡します。これは何らかの方法でキーを保存します (たとえば、共有設定)。

2)アプリを搭載したメーカー販売のデバイス(特別、改造)。

3) ユーザーがそれを取得すると、Google Play にはアプリの次のバージョン (標準、特別なコードなし) が確実に存在するため、ユーザーは起動せずに更新する可能性があります (最悪の場合)。

4) 追跡可能性を失いました。(新しいapkを完全に削除することは、特別な古いものを起動することはありませんでした)

それを解決するために、システム ブロードキャスト ON_BOOT_COMPLETE を聞いていましたが、Android 3.1+ では正しく動作しません

どうすればそれを行うことができますか?

4

4 に答える 4

3

アプリケーションがシステム アプリケーションかどうかを知る方法はいくつかあります。アプリケーションのインストールディレクトリを確認FLAG_SYSTEMしたり、アプリケーションを確認したりします。

方法 1 : - アプリケーションの場所を確認する

public static boolean applicationIsSystemApp(Context mContext, String packageName) {

    try {
        ApplicationInfo applicationInfo = mContext.getPackageManager().getApplicationInfo(packageName, 0);        
        String appLocation = applicationInfo.publicSourceDir; 
        // OR String appLocation = applicationInfo.sourceDir;  
        // Both returns the same
        // if package is pre-installed then output will be /system/app/application_name.apk
        // if package is installed by user then output will be /data/app/application_name.apk

        // Check if package is system app 
        if (appLocation != null && appLocation.startsWith("/system/app/")) {
            return true; 
        }
    } catch (NameNotFoundException e) {
        e.printStackTrace(); // TODO Can handle as your logic
    }
    return false; 
}

方法 2 : - アプリケーションの FLAG_SYSTEM を確認する

public static boolean applicationIsSystemApp(Context mContext, String packageName) {

    try {
        ApplicationInfo applicationInfo = mContext.getPackageManager().getApplicationInfo(packageName, 0);   
        // FLAG_SYSTEM is only set to system applications, 
        // this will work even if application is installed in external storage

        // Check if package is system app 
        if ((applicationInfo.flags & ApplicationInfo.FLAG_SYSTEM) != 0) {
            return true; 
        }
    } catch (NameNotFoundException e) {
        e.printStackTrace(); // TODO Can handle as your logic
    }
    return false; 
}

そして、このメソッドを次のように呼び出します

if (applicationIsSystemApp(getApplicationContext(), "com.example.mysystemapp")) {
     // Application is system app
} else {
     // Application has been installed as 3rd Party app
}
于 2013-11-21T07:03:04.667 に答える