2016-03-11 5 views
10

私はStackOverFlowと他のウェブサイトで与えられた多くの方法を試しましたが、実際には機能しません。apkをプログラムで自動的に更新してアプリを再起動するにはどうすればよいですか?

私の問題は、私はこのアプリケーションを更新する必要があり、更新後、自動的に同じアプリケーション(更新済み)に戻ります。

これは私のコードです:

private synchronized void runRootUpdate() {  
    // Install Updated APK 
    String command = "pm install -r " + downloadPath + apkFile; 
    Process proc = Runtime.getRuntime().exec(new String[] {"su", "-c", command}); 
    int test = proc.waitFor(); // Error is here. 

    if (proc.exitValue() == 0) { 
     // Successfully installed updated app 
     doRestart() 
    } else { 
     // Fail 
     throw new Exception("Root installation failed"); 
    } 
} 

private void doRestart() { 
    Intent mStartActivity = new Intent(context, MainActivity.class); 
    int mPendingIntentId = 123456; 
    PendingIntent mPendingIntent = PendingIntent.getActivity(context, mPendingIntentId, mStartActivity, PendingIntent.FLAG_CANCEL_CURRENT); 
    AlarmManager mgr = (AlarmManager)context.getSystemService(Context.ALARM_SERVICE); 
    mgr.set(AlarmManager.RTC, System.currentTimeMillis() + 100, mPendingIntent); 
    System.exit(0); 
} 

は私を見てください "というエラーがここにあります。"私の古いアプリは新しいアップデートされたアプリをインストールし、それ自身を殺すので、proc.waitFor()はなくホーム画面に戻りますが、新しいアップデートされたアプリがインストールされています。しかし、私はそれを元に戻す必要があります。私はそれを行うことができる方法はありますか?

+0

あなたは今どんな解決策を持っています? –

+0

更新方法を教えてください。アプリケーションがinn foregroundを実行しているときはオンですか? –

答えて

0

アプリケーションを更新すると、すべてのプロセスが強制終了されます。 pmコマンドを起動する前にアラームを設定する必要があります(遅延が100msを超える)

0

まず、.apkファイルを保存する場所を知る必要があります。アプリケーションをアップグレードする際に重要です。

アプリケーションをサイレントモードにアップグレードして起動するには、次の手順に従います。あなたはapplication.Ifそれは、その後持つデフォルトを使用してアプリケーションをアップグレードするコードの上にアップグレード

File file = new File(Environment.getExternalStorageDirectory(), "app-debug.apk"); // mention apk file path here 
       if (file.exists()) { 
        Intent intent = new Intent(Intent.ACTION_VIEW); 
        intent.setDataAndType(Uri.fromFile(file), "application/vnd.android.package-archive"); 
        startActivity(intent); 
       } else { 
        Toast.makeText(UpdateActivity.this, "file not exist", Toast.LENGTH_SHORT).show(); 
       } 

については、以下のような意図を経由して起動されるアップグレード中

、あなたのSDカードに最新の.apkファイルを持っていることを確認してくださいアンドロイドの動作。

あなたは、API < = 12使用

を持っている場合は、API> 12使用

<action android:name="android.intent.action.MY_PACKAGE_REPLACED" /> 
        </intent-filter> 

を使用している場合、アップグレードが

<receiver android:name=".receiver.OnUpgradeReceiver"> 
       <intent-filter> 
// Note: This intent can is available starting from API 12 
        <action android:name="android.intent.action.MY_PACKAGE_REPLACED" /> 
       </intent-filter> 
      </receiver> 

を行う際に知っている放送受信機を作成します。

<action android:name="android.intent.action.PACKAGE_REPLACED" /> 
    <data android:scheme="package" android:path="your.app.package" /> 

あなたが

例をしたい更新し、打ち上げの活動の後に放送さ取得するための放送受信機を作成します。

public class OnUpgradeReceiver extends BroadcastReceiver { 

    @Override 
    public void onReceive(Context context, Intent intent) { 
     // launch your fav activity from here. 
    } 
} 

放送受信機の上に静かにアプリケーションを起動するのに役立ちます。

これらの情報が役立ちます。

+0

あなたの答えをありがとう。しかし、プロンプトを表示せずに自動的に更新する必要があります。 –

+0

それはアンドロイドのデフォルト動作であるため、彼らは決してあるべきではありません。 –

7

アラームを設定するのではなく、この目的のためにマニフェストにBroadcastReceiverを登録してください。それはandroid.intent.action.PACKAGE_REPLACEDに耳を傾けるのいずれかのことができます(注:Wordのアクションは、この定数から欠落している)、このメッセージが表示されます後、あなたの受信機を再インストールするか、android.intent.action.MY_PACKAGE_REPLACED

<receiver android:name="..."> 
    <intent-filter> 
     <action android:name="android.intent.action.PACKAGE_REPLACED"></action> 
     <data android:scheme="package" android:path="com.your.package" /> 
    </intent-filter> 
</receiver> 

に、あなたが活動を開始することができるでしょう

+0

放送受信機が決して私のために意図を持っていなかったので、なぜこの答えがそんなに上向きであるのかわからない。 –

+0

マニフェストに登録されているレシーバの場合、プログラム上のアクティビティではない? –

+0

はい、マニフェストに登録してください。 –

0

うーん...これはなぜハードメトロ、ルートインストールを使用しているときに使用するには?なぜアプリケーションを更新する簡単なシェルスクリプトを作成しようとしない?そして、あなたはドントアラームを設定し、他のことをやっている必要があります

スクリプト(How to pass argumentsHow to start app from terminal):

am kill com.myapp.package 
pm install -r $1 
am start -n packageName/pkgName.ActivityName 

アプリケーションコード:

String command = "sh script.sh " + downloadPath + apkFile; 
Process proc = Runtime.getRuntime().exec(new String[] {"su", "-c", command}); 
+0

'' sh script.sh "'の意味は何ですか?それはスクリプトへのパスですか?後で読むファイルとして作成できますか? –

+0

shはスクリプトを実行するためのシェルコマンドですscript.shはスクリプトへのパッチです。はい、ファイルとして作成できます。 –

+0

これはそれです。ありがとうございました! –

関連する問題