2016-05-16 15 views
9

私の使用例の1つでは、最初のアプリケーションがサーバーに接続し、同じアプリケーションのアップデートをダウンロードします。MarshmallowでプログラムでAPKをインストール

私はAndroidのDownloadManagerクラスをダウンロードしています。 次に、以下のコードを使用して、onReceive()にアプリインストーラのインテントを作成しようとします。つまり、APKが正常にダウンロードされた後です。

@Override 
public void onReceive(Context context, Intent intent) { 

    //check if the broadcast message is for our Enqueued download 
    long referenceId = intent.getLongExtra(DownloadManager.EXTRA_DOWNLOAD_ID, -1); 
    if (downloadReference == referenceId) { 
     try { 
      Log.v("", "Downloading of the new app version complete"); 

      String filepath = Environment.getExternalStorageDirectory() + "/" + 
        Environment.DIRECTORY_DOWNLOADS + "/" + mLatestVersionFileName; 

      //start the installation of the latest version 
      Uri uri = downloadManager.getUriForDownloadedFile(downloadReference); 

      //downloadManager.getUriForDownloadedFile(downloadReference) 
      Uri fileLoc = Uri.fromFile(new File(filepath)); 

      Intent promptInstall = new Intent(Intent.ACTION_VIEW); 
      promptInstall.setDataAndType(uri, "application/vnd.android.package-archive"); 
      promptInstall.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
      startActivity(promptInstall); 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 

    } 
} 

コードはPre-Marshmallowデバイスで正常に動作し、ユーザーはAPKをインストールする画面を表示します。

これはマシュマロデバイスでは機能しません。

私はマシュマロに次の例外を取得しています:

android.content.ActivityNotFoundException://ダウンロード/ my_downloads /:いいえ活動はテント{行為= android.intent.action.VIEW DAT =コンテンツを処理することが判明し287 TYP =アプリケーション/ vnd.android.package-アーカイブFLG = 0x10000000}

私は物事次試してみました:

  1. の月の正確なPackageInstallerを使用してshmallow (com.google.android.packageinstaller/com.android.packageinstaller.PackageInstallerActivity)インテントのコンポーネント名。
  2. uriの代わりにfileLocを渡します。
promptInstall.setDataAndType(uri, "application/vnd.android.package-archive"); 

これは、 '解析エラー' になります。

理想的なインテントはAndroid OSによって解決されます。私はそれが大きな問題ではないと思っています。

答えて

3

public void onReceive(Context context, Intent intent) { 
       String action = intent.getAction(); 
       if (DownloadManager.ACTION_DOWNLOAD_COMPLETE.equals(action)) { 
        long downloadId = intent.getLongExtra(
          DownloadManager.EXTRA_DOWNLOAD_ID, 0); 
        Query query = new Query(); 
        query.setFilterById(enqueue); 
        Cursor c = dm.query(query); 
        if (c.moveToFirst()) { 
         int columnIndex = c 
           .getColumnIndex(DownloadManager.COLUMN_STATUS); 
         if (DownloadManager.STATUS_SUCCESSFUL == c 
           .getInt(columnIndex)) { 

          ImageView view = (ImageView) findViewById(R.id.imageView1); 
          String uriString = c 
            .getString(c 
              .getColumnIndex(DownloadManager.COLUMN_LOCAL_URI)); 

          //start the installation of the latest version 
          Uri uri = Uri.parse(uriString); 
          Intent promptInstall = new Intent(Intent.ACTION_VIEW); 
          promptInstall.setDataAndType(uri, "application/vnd.android.package-archive"); 
          promptInstall.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
          mContext.startActivity(promptInstall); 
         } 
        } 
       } 
      } 
これを試してみてください
3

あなたはこれを試すことができます:

@Override 
public void onReceive(Context context, Intent intent) { 

String action = intent.getAction(); 

     if (DownloadManager.ACTION_DOWNLOAD_COMPLETE.equals(action)) { 

      DownloadManager.Query query = new DownloadManager.Query(); 
      query.setFilterById(yourDownloadID); 
     DownloadManager dm = (DownloadManager)getSystemService(DOWNLOAD_SERVICE); 
      Cursor downloadResult = dm.query(query); 

      if (downloadResult.moveToFirst()) { 
       int statusColumnIndex = downloadResult.getColumnIndex(DownloadManager.COLUMN_STATUS); 
       int status = downloadResult.getInt(statusColumnIndex); 

       if (status == DownloadManager.STATUS_SUCCESSFUL) { 
        //download completed successfully 
        int localFileNameId = downloadResult.getColumnIndex(DownloadManager.COLUMN_LOCAL_FILENAME); 

        String downloadPathFile = downloadResult.getString(localFileNameId); 

     Intent intent = new Intent(Intent.ACTION_VIEW); 
        intent.setDataAndType(Uri.fromFile(new File(downloadPathFile)), "application/vnd.android.package-archive"); 
        intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
        startActivity(intent); 
} 
関連する問題