2011-07-07 12 views
3

ユーザーがアプリケーション(.apkファイル)のインストールをキャンセルした場合の状況を検出するにはどうすればよいですか?ユーザーがプログラム(.apk)のインストールをキャンセルしたときの状況を検出する方法は?

私のアプリはプログラムによって他のアプリをインストールしますが、ユーザーはインストールプロセスをキャンセルできます。インストール中に、ユーザーには次のようなダイアログが表示されます。"アプリケーションの置き換え:インストールしているアプリケーションは別のアプリケーションを置き換えます"そしてダイアログボックス"このアプリケーションをインストールしますか?"。ユーザーが「Install」を押すと、ACTION_PACKAGE_...ブロードキャストが生成されます。しかし、ユーザーが「キャンセル」を押したかどうかを検出する方法はありますか?

+0

何ですか?もっとよく説明してください... – evilone

+0

私のアプリケーションは、他のアプリケーションをプログラムによって(または更新して)インストールします。しかし、インストール中に、ユーザーには「アプリケーションを置き換える、インストールしているアプリケーションが別のアプリケーションを置き換える」というようなダイアログが表示されます。次に、「このアプリケーションをインストールしますか?」というダイアログが表示されます。ユーザーが「インストール」を押すと、ACTION_PACKAGE ...が生成されます。しかし、ユーザーは「キャンセル」を押していますか?それをどのように検出するのですか? – alexeykoval

+0

この問題は解決しましたか?私はここで同じことをしている。 – YasuDevil

答えて

1

私は、ユーザーのアンインストールやないアプリをインストールする場合は検出できないと思いますが、あなたはアクション

5
public class ApplicationInstaller extends Activity { 

    private final static int createState = 1, installState = 2; 
    private int activityState = 0, counter = 0; 
    private ApplicationInstallerReceiver aIR; 
    private String appName, appPath; 
    private boolean result; 

    //--------------------------------------------------------------------------------------------- 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.app_installer); 
     if (activityState == 0) { 
      this.activityState = ApplicationInstaller.createState; 
      this.appName = this.getIntent().getStringExtra("AppName"); 
      this.appPath = this.getIntent().getStringExtra("AppPath"); 
      if (this.appName == null || this.appPath == null) { 
       finish(); 
      } 
     } 
    } 

    //--------------------------------------------------------------------------------------------- 
    @Override 
    public void onStart() { 
     super.onStart(); 
     if (this.activityState == ApplicationInstaller.createState) { 
      activityState = ApplicationInstaller.installState; 
      aIR = new ApplicationInstallerReceiver(); 
      IntentFilter ifilter = new IntentFilter(); 
      ifilter.addAction(Intent.ACTION_PACKAGE_ADDED); 
      ifilter.addAction(Intent.ACTION_PACKAGE_CHANGED); 
      ifilter.addAction(Intent.ACTION_PACKAGE_INSTALL); 
      ifilter.addAction(Intent.ACTION_PACKAGE_REPLACED); 
      ifilter.addDataScheme("package"); 
      registerReceiver(aIR, ifilter); 
      Intent intent = new Intent(Intent.ACTION_VIEW); 
      intent.setDataAndType(Uri.fromFile(new File(appPath)), "application/vnd.android.package-archive"); 
      try { 
       startActivity(intent); 
      } catch (Exception e) { 
       result = false; 
       finish(); 
      } 
     } else { 
      finish(); 
     } 
    } 

    //--------------------------------------------------------------------------------------------- 
    @Override 
    protected void onResume() { 
     super.onResume(); 
     counter++; 
     if (counter == 2) { 
      finish(); 
     } 
    } 

    //--------------------------------------------------------------------------------------------- 
    @Override 
    protected void onDestroy() { 
     super.onDestroy(); 
     if (aIR != null) { 
      this.unregisterReceiver(aIR); 
     } 
     if (activityState == installState) { 
      Intent intent = new Intent(DeviceSoftWareManager.installerAction); 
      intent.putExtra("Result", this.result); 
      sendBroadcast(intent); 
     } 
    } 

    //--------------------------------------------------------------------------------------------- 
    class ApplicationInstallerReceiver extends BroadcastReceiver { 
     @Override 
     public void onReceive(Context context, Intent intent) { 
      result = true; 
      ApplicationInstaller.this.finish(); 
     } 
    } 
} 

を行うには、あなたのアプリを起動したりした後にするときに必要な他のアプリがインストールされていることを確認することができますユーザーが「インストール」を選択した場合は、Intent.ACTION_PACKAGE...アクションが生成されます。

ユーザーが「インストールしない」を選択した場合、アクティビティはIntent.ACTION_PACKAGE...アクションなしで終了します。

これは、「ユーザーがインストールをキャンセルしました」という意味です。

+0

DeviceSoftWareManagerクラスを取得する方法 – amity

関連する問題