5

私のアプリがAndroidフォンにインストールされるようなことをしたいです。誰も電話からアンインストールすることはできません。または、誰かがアンインストールしようとすると、ポップアップ ショーまたはアラートが表示されます。方法はありますか?

4

4 に答える 4

7

機能を無効にするには、deviceAdmin を有効にする必要がForce StopありUninstallます。これは、Device Admin APIエンタープライズ/アプリ ポリシー管理を処理する によって処理されます。

于 2012-10-08T09:58:13.627 に答える
3

明示的に無効にすることは不可能です。ただし、これには回避策を使用できます。バックグラウンドで永続的に実行されるアプリでサービスを作成します。

//MasterService.java
public class MasterService extends Service{

    private ThreadPoolExecutor executor;
    private Runnable runnable = new Runnable(){
        @Override
        public void run(){}
    };

    public MasterService(){
        executor = new ThreadPoolExecutor(1, 1, 1, TimeUnit.SECONDS, 
                       new LinkedBlockingQueue<Runnable>());
    }

     @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        executor.execute(runnable);
        return super.onStartCommand(intent, flags, startId);
    }

    @Override
    public IBinder onBind(Intent intent) {
        throw new UnsupportedOperationException("Not yet implemented");
    }


    @Override
    public void onDestroy() {
        super.onDestroy();
        executor.shutdown();
    }

};

startService(new Intent(this, MasterService.class));で開始し、マニフェストでエクスポートおよび有効化されていることを宣言することを忘れないでください。

Android では、アプリをアンインストールするためにパッケージ マネージャーを実行する必要があります (root 化されていない電話では)。Runnableで、パッケージ マネージャーがフォアグラウンドで実行されているかどうかを検出する必要があります。はいの場合、ビューを使用して入力フォーカスを取得するアクティビティを開始します。

//MasterService.java (inside runnable)
@Override
public void run(){
    while(true) {
        ActivityManager activityManager = (ActivityManager) getSystemService(ACTIVITY_SERVICE);
        List<ActivityManager.RunningAppProcessInfo> procInfos = activityManager.getRunningAppProcesses();

        for (int i = 0; i < procInfos.size(); i++) {
            //check if package installer runs in foreground
            if (procInfos.get(i).processName.equals("com.android.packageinstaller") && procInfos.get(i).importance == ActivityManager.RunningAppProcessInfo.IMPORTANCE_FOREGROUND) {

                //start activity
                startActivity(new Intent(MasterService.this, OverlayActivity.class).setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_NO_HISTORY));
            }
        }
    }
}

アクティビティで、任意のビューを作成し、戻るボタンをオーバーライドして、ユーザーがパッケージ アンインストーラー画面に戻らないようにします。

//OverlayActivity.java
public class OverlayActivity extends Activity{

    private ImageView view;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        view = new ImageView(this);
        setContentView(view);
    }


    @Override
    public void onBackPressed() {

    }
};

ホーム ボタンは重要ではありません。これにより、すべてのアクティビティが非表示になり、ユーザーがタスク ボタンを押してパッケージ マネージャーを選択すると、OverlayActivity再び開かれます。マスター サービスを停止または強制終了できないことを確認します。これを解決するには、次の 2 つの方法があります。

  1. onDestroy関数で、サービスを再度起動するカスタム ブロードキャスト メッセージを送信します。
  2. をチェックして、設定アプリも無効にしますcom.android.settings

ユーザーはいつアプリをアンインストールするかを知っている必要があるため、あなたが何をすべきかを知っていただければ幸いです。

于 2016-12-07T15:16:53.433 に答える
1

理論的には、電話を「ルート化」し、アプリケーションをシステム パーティションに追加して (ユーザーはシステム パーティションを変更できません)、電話を再度「ルート化解除」することができます。ただし、これがすべてのモデルで機能するかどうかはわかりません。一部のデバイスは「ルート化解除」できません。

于 2012-04-20T07:09:50.427 に答える
0

これを達成できる唯一の方法は、2 つのアプリケーションを使用することです。

  1. マスターです。サービスとして実行され、アプリが
    インストールされているかどうかを確認し、見つからない場合はインストールします。
  2. ユーザーに見てもらいたいアプリです

わかりました..まあ、他の方法を考えることができます..Blessenmが言ったように、OSを変更します..しかし、それはあなたが特定のハードウェアをターゲットにしていると仮定しています。

システムをルート化できる可能性があります。これにより、管理者のアイデアにアクセスできるようになります..うまくいくかどうかはわかりません.

于 2012-04-20T06:58:51.300 に答える