2017-01-16 6 views
1

Um so knapp wie möglich zu sein:Parse Fehler beim Versuch toprogrammaticly APK aus Android-App installieren

-APK-Datei ist nicht beschädigt.

-Ich kann zum APK im Dateisystem des Telefons navigieren und es manuell von dort ohne Problem installieren.

-Ich verwende den folgenden Code, um den Installationsvorgang zu starten. Speicherort der Datei korrekt ist bestätigt:

public void installfromlocal() 
    { 
     String downloadfilelocation = getsharedresourcestring("updatepackagelocation"); 
     Log.e("installing from",downloadfilelocation); 
     Intent intent = new Intent(Intent.ACTION_VIEW); 
     intent.setDataAndType(Uri.fromFile(new File(downloadfilelocation)), "application/vnd.android.package-archive"); 
     intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
     startActivity(intent); 
    } 

Bisher, was ich von ein paar Stunden im Internet sammeln konnte, ist, dass anscheinend kann ich nicht meine app eine APK-Datei programmatisch aus dem externen Speicher installieren lassen. Ich kann die Datei anscheinend auch nicht auf internen Speicher kopieren und von dort installieren.

Was nun? Außerdem erhalte ich keine Nachrichten von Logcat. Ich bekomme nur ein Popup, das mich darauf aufmerksam macht, dass beim Parsen der Apk ein Fehler aufgetreten ist.

+0

Wo ** genau ** steht 'downloadfilelocation'? – CommonsWare

+0

'downloadfilelocation' Ist der Pfad in Ordnung, den Sie im Protokoll erhalten? – Vikrant

+0

Ja, die Lage ist in Ordnung. Es zeigt auf Datei: ///storage/sdcard0/Download/org.mycompany.myapp.apk –

Antwort

1

Ich fand eine Lösung für mich (nicht so klar, warum dieses Problem haben, aber ich löse es).

Es scheint mir, dass Sie beim Download mit DownloadManager können Sie nicht auf die heruntergeladene Datei über URI zugreifen, und Sie erhalten Zugriff verweigert (und verschiedene Datei nicht gefunden Ausnahmefehler), warum PackageInstaller kann überhaupt nicht das Manifest lesen (und das ist die Parse-Fehler).

Das ist, was ich getan habe, ich hoffe, dass Sie Problem auch lösen, ich weiß, es ist nicht elegant, um es gelinde auszudrücken.

Wegen DownloadManager.COLUMN_LOCAL_FILENAME i mit COLUMN_LOCAL_URI veraltet versucht, auf die Datei zuzugreifen und Zugriff auf seinen Inhalt (q Cursor)

String strUri = q.getString(q.getColumnIndex(DownloadManager.COLUMN_LOCAL_URI)); 
Uri apkUri = Uri.parse(strUri); 

mit diesem uri i und die Datei in eine temporäre Datei kopieren zugreifen können in (getExternalCacheDir)

ParcelFileDescriptor pfd = context.getContentResolver().openFileDescriptor(apkUri, "r"); 

InputStream inFile = new FileInputStream(pfd.getFileDescriptor()); 
OutputStream outFile = new FileOutputStream(tmpFile); 

     //copy 
     byte[] buffer = new byte[1024]; 
     int length; 

     while ((length = inFile.read(buffer)) > 0) { 
      outFile.write(buffer, 0, length); 
     } 

     outFile.flush(); 
     inFile.close(); 
     outFile.close(); 

Ergreifen Sie die Datei erstellt und erhalten ihre uri (dh zugänglich) und starten Sie die Tätigkeit mit diesem uri.

Ich hoffe, es

1

hilft Sie kanonischen Pfad der Datei verwendet werden sollen. Aus dem Doku-

Ein kanonischer Pfadname ist sowohl absolut als auch eindeutig. Die genaue Definition der kanonischen Form ist systemabhängig. Diese Methode konvertiert diesen Pfadnamen bei Bedarf zuerst in die absolute Form, als würde sie die getAbsolutePath() -Methode aufrufen und dann systemabhängig in ihre eindeutige Form umwandeln. Dazu gehört normalerweise das Entfernen redundanter Namen wie "." und ".." aus dem Pfadnamen, Lösen von symbolischen Links (auf UNIX-Plattformen) und Konvertieren von Laufwerksbuchstaben in einen Standardfall (auf Microsoft Windows-Plattformen).

+0

Warum sollte ich das tun? –

+1

Das Problem ist mit einigen Buggy Builds von Android von einigen OEMs, der PackageInstaller gibt Fehler - EACCES (Berechtigung verweigert), während Sie weiterhin auf die Datei von diesem Pfad zugreifen können. Sie müssen also die Datei getCanonicalPath() abrufen. Das Paketinstallationsprogramm installiert es. –

+1

Okay. Danke für die Erklärung. –

Verwandte Themen