2016-05-16 48 views
9

In un mio caso di utilizzo l'applicazione nel server di contatti iniziali scarica l'aggiornamento della stessa applicazione.Installazione APK a livello di codice su Marshmallow

Per il download sto utilizzando la classe DownloadManager di Android. Quindi, utilizzando il codice seguente, tenta di creare l'intento di installazione dell'app in onReceive(), ad esempio dopo che l'APK è stato scaricato correttamente.

@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(); 
     } 

    } 
} 

Il codice funziona bene per i dispositivi Pre-Marshmallow e utente ottiene schermo per installare APK.

Questo non funziona sul dispositivo Marshmallow.

sto ottenendo il seguente eccezione Marshmallow:

android.content.ActivityNotFoundException: trovate attività per gestire Intent {atto = android.intent.action.VIEW dat = tenore: // download/my_downloads/287 typ = application/vnd.android.package-archivio FLG = 0x10000000}

ho cercato seguenti cose:

  1. utilizzando esattamente PackageInstaller di mar shmallow (com.google.android.packageinstaller/com.android.packageinstaller.PackageInstallerActivity) nome componente come parte di Intent.
  2. Passare fileLoc anziché uri.
promptInstall.setDataAndType(uri, "application/vnd.android.package-archive"); 

Ciò si traduce in 'errore Parse'.

Gli intenti ideali vengono risolti dal sistema operativo Android. Immagino che non sia un grosso problema e forse mi manchi qualcosa durante la creazione di Intent.

risposta

3

Prova questo

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

Puoi provare questo:

@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); 
}