2016-08-25 1 views
0

私は非公開のAndroidアプリを持っていますが、GoogleマーケットやGoogleのプレイではありません。 apkファイルはプライベートWebサーバー上でホストされており、新しいバージョンがあるかどうかを確認するためにモバイルデバイスがPOST要求を行うことができるURLもあります。Android:Webサーバーでホストされているapkから自分のアプリを更新するには?

新しいバージョンがある場合は、「アップグレード」というボタンをユーザーに表示するだけです。オンクリックリスナーはこれを行います:

final View.OnClickListener upgradeButton_OnClickListener = new View.OnClickListener() { 
    @Override 
    public void onClick(View view) { 
     String url = "https://example.com/android-app/app-release.apk"; 
     Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(url)); 
     startActivity(intent); 
    } 
}; 

...これは理想的ではありません。 apkファイルがダウンロードされたボタンをクリックして、「インストールはい/いいえ」と表示されているアプリインストーラ画面が表示されたらいいですね。私はちょうどそれを行う方法を知らない。

私はインターネット上でこれを行う方法を探してきましたが、決定的な答えは見られませんでした。誰かが私にすべてのステップのチュートリアルを教えてもらえますか?私はおそらく、ほとんどの人がGoogleのマーケットやGoogleのプレーを利用していると知っていますが、私はそれをやっていないので、これを理解することは難しいです。

編集1 -----------------------------------------

今私はonclickのリスナーでこれを持っている:

final View.OnClickListener upgradeButton_OnClickListener = new View.OnClickListener() { 
    @Override 
    public void onClick(View view) { 
     int permissionCheck = ContextCompat.checkSelfPermission(MainActivity.this, Manifest.permission.WRITE_EXTERNAL_STORAGE); 
     if(permissionCheck == PackageManager.PERMISSION_GRANTED){ 
      DownloadManager.Request request = new DownloadManager.Request(Uri.parse("https://example.com/android-app/app-release.apk")); 
      request.setTitle("This App Upgrade."); 
      request.setDescription("File is being downloaded ..."); 
      request.allowScanningByMediaScanner(); 
      request.setNotificationVisibility(DownloadManager.Request.VISIBILITY_VISIBLE_NOTIFY_COMPLETED); 
      request.setDestinationInExternalPublicDir(Environment.DIRECTORY_DOWNLOADS, "app-release.apk"); 
      DownloadManager manager = (DownloadManager) getSystemService(Context.DOWNLOAD_SERVICE); 
      registerReceiver(onDownloadComplete, new IntentFilter(DownloadManager.ACTION_DOWNLOAD_COMPLETE)); 
      manager.enqueue(request); 
     } 
    } 
}; 

そして、この:

BroadcastReceiver onDownloadComplete = new BroadcastReceiver(){ 
    @Override 
    public void onReceive(Context context, Intent intent) { 
     intent.setDataAndType(Uri.parse(Environment.DIRECTORY_DOWNLOADS + "app-release.apk"), 
       "application/vnd.android.package-archive"); 
     startActivity(intent); 
    } 
}; 

私はダウンロードをやろうとしてから、エラーを持っていた:

java.lang.SecurityException: No permission to write to /storage/emulated/0/Download/app-release.apk: Neither user 10062 nor current process has android.permission.WRITE_EXTERNAL_STORAGE. 

そのため、私はpermissionCheckを実装しようとしましたが、今ボタンをクリックすると何も起こりません。

答えて

0

はい、可能です。いくつかの 'IFs'では、電話機をルーツにし、サードパーティのソースのインストールを有効にする必要があります。

基本的には、ファイルをダウンロードすると、pm install Androidのコマンドを呼び出す必要があります。

これは、ファイルダウンロードすることができます方法です。 Download a file with Android, and showing the progress in a ProgressDialog

をそして、あなたは

として新しいテントを起動しようとするかもしれないルートがなければ

Process process = null; 
try 
{ 
    process = Runtime.getRuntime().exec("su"); 
    DataOutputStream dataOutputStream=new DataOutputStream(process.getOutputStream()); 

    String cmd="pm install /sdcard/LatestUpdate.apk"; 
    dataOutputStream.writeBytes(cmd+"\n"); 
} 
catch (IOException e) 
{ 
    e.printStackTrace(); 
} 

をインストールし、この作品は午後のほんの一例です

Intent intent = new Intent(Intent.ACTION_VIEW); 
intent.setDataAndType(Uri.fromFile(new File(filePath)),"application/vnd.android.package-archive"); 
startActivity(intent); 

アプリケーションのインストールダイアログが表示されます。しかし、まだ未知の情報源からのインストールは必須です。

+0

いいえ、電話機はルートできません。私ができるサードパーティソース。私は今どこにいるのかを示すために質問を更新しましたが、これは固まっていますが、少なくとも最初は固まっていたのとはちょっと違っていました。 –

+0

Androidマニフェストにandroid.permission.WRITE_EXTERNAL_STORAGEを追加 –

関連する問題