2017-01-16 107 views
1

儘可能簡潔:嘗試從安卓應用程序toprogrammatically安裝APK時解析錯誤

-APK文件未損壞。

- 我可以瀏覽到手機文件系統中的APK,並從那裏手動安裝它,沒有問題。

-I使用以下代碼啓動安裝過程。文件的位置是正確的證實:

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

到目前爲止,我可以從互聯網上幾個小時收集的,顯然我不能讓我的應用程序從外部存儲程序安裝APK。我也可以顯然不復制文件到內部存儲並從那裏安裝。

那麼現在呢?另外,我沒有收到來自Logcat的消息。我只有一個彈出窗口提醒我解析apk時出現錯誤。

+0

** **確實**是'downloadfilelocation'指向? – CommonsWare

+0

'downloadfilelocation'您在日誌中獲取的路徑是否正常? – Vikrant

+0

是的,位置很好。它指向file:///storage/sdcard0/Download/org.mycompany.myapp.apk –

回答

1

我找到了一個解決方案(不太清楚爲什麼有這個問題,但我解決了它)。

在我看來,下載DownloadManager時無法通過URI訪問下載的文件,並且您獲取訪問被拒絕(以及各種文件未找到異常錯誤),這就是爲什麼PackageInstaller無法讀取所有清單(並且這是解析錯誤)。

這就是我所做的,我希望能解決你的問題,我知道這不是最優雅的說法。

由於DownloadManager.COLUMN_LOCAL_FILENAME的已棄用i相COLUMN_LOCAL_URI試圖訪問該文件,並用這個URI訪問其內容(q是光標)

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

我可以訪問和將文件複製到一個臨時文件中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(); 

抓住文件中創建並獲得其URI(可訪問),並開始與URI活動。

我希望它有幫助

1

你應該使用文件的規範路徑。來自文檔 -

規範路徑名既是絕對路徑名也是唯一路徑名。規範形式的確切定義是與系統相關的。如果需要,此方法首先將此路徑名轉換爲絕對形式,就像調用getAbsolutePath()方法一樣,然後以系統依賴的方式將其映射到其唯一形式。這通常涉及刪除冗餘名稱,如「。」和路徑名「..」,解析符號鏈接(在UNIX平臺上),並將驅動器號轉換爲標準大小寫(在Microsoft Windows平臺上)。

+0

爲什麼我需要這樣做? –

+1

問題是由一些OEM的一些錯誤構建的android的一些OEM,packageInstaller給出錯誤 - EACCES(權限被拒絕),而你仍然可以從該路徑訪問該文件。所以你需要獲取文件,getCanonicalPath()。軟件包安裝程序安裝它。 –

+1

好的。感謝您的解釋。 –