2010-01-04 66 views
1

問題是這樣的:轉換的HttpResponse到.apk文件

我使通過互聯網連接到某些URL和接受一個HttpResponse與app_example.apk。

然後我想用這個數據在SD卡中創建一個文件(.apk) ,這樣下載的應用程序 可以稍後安裝。

如何將HttpResponse轉換爲.apk文件?

讓我們澄清了一些細節:

  • 我通過互聯網連接到我的服務器得到這個apk文件
  • 我不想安裝這個應用我收到一份關於SD卡
  • 所有這是必須在我的代碼,我不能使用安卓市場

我目前正在寫入該文件。

我在做什麼是HttpResponse對象轉換爲一個byte [],

那麼的byte []寫入使用ObjectOutputStream文件(.apk文件)。

像這樣:

// byte[] appByteArray - already has the internet response converted in bytes 

    try { 
    file = new File(Environment.getExternalStorageDirectory()+"/"+appName+".apk"); 

    file.createNewFile(); 

    FileOutputStream stream = null; 

    stream = new FileOutputStream(file, false); 

    ObjectOutputStream objectOut = 
     new ObjectOutputStream(new BufferedOutputStream(stream)); 

    objectOut.writeObject(appByteArray); 

    objectOut.close(); 

    } catch (Exception e) { 
     e.printStackTrace(); 
    } 

最後,該文件被創建 並具有接收到的內容。

當我嘗試安裝它, 通過VIEW intent(使用默認安裝程序) 我得到一個解析錯誤,說它找不到AndroidManifest.xml。

我認爲,在一段路上,接收到的數據被破壞。

你有解決這個問題的另一種方法嗎?

非常感謝

+0

您可以請您發佈實際的日誌輸出,你從調用'VIEW'意圖的點? – 2010-01-05 03:18:10

+0

apk文件只是一個具有不同擴展名的zip文件,因此您可以將文件從SD卡中取出並嘗試解壓縮,並查看它是否包含您期望的所有內容。 – CaseyB 2010-01-04 20:44:47

回答

4
  1. 不要使用ObjectOutputStream,字節數組被序列化爲Object,而不是寫成原始數據。
  2. 你確定你有SD卡寫入權限嗎? android.permission.WRITE_EXTERNAL_STORAGE
  3. 請勿寫入SD卡根目錄。根目錄中的文件數量可能會受到限制。而是在SD CARD上創建你的應用程序子目錄。

此代碼的工作對我來說:

try { 
     String filePath = Environment.getExternalStorageDirectory() 
       + "/myappdir/" + appName + ".apk"; 

     File file = new File(filePath); 
     file.getParentFile().mkdirs(); 
     file.createNewFile(); 

     BufferedOutputStream objectOut = new BufferedOutputStream(
       new FileOutputStream(file)); 

     objectOut.write(appByteArray); 

     objectOut.close(); 

    } catch (Exception e) { 
     e.printStackTrace(); 
    } 
+0

這段代碼使它工作!就像Erich Douglass所說的那樣,ObjectOutputStream可能會向創建的文件添加額外的數據,這可能是問題所在。 非常感謝。 葡萄牙語:Obrigado! – Tsimmi 2010-01-05 16:16:47

+0

高興地幫助:-) – 2010-01-05 18:14:53

+0

這就像一個魅力,我有一個簡單的問題是,從entitiy的內容長度是582504,但當我看着文件管理器的大小上升到863145。我認爲一些數據是在將文件寫入SD卡時被添加。有沒有解決這個問題的方法? – prometheuspk 2013-02-22 07:13:13

1

這可能不是核心問題,但我不認爲你想在ObjectOutputStreamstream,因爲這是用於對象序列化。這可能是它將額外的數據添加到文件中,因此可以使用ObjectInputStream進行反序列化。

我會嘗試從模擬器(或設備)拉下apk並檢查它是否與服務器上的文件相對應,以確保正確寫出這些位。

+0

確實。只需將'appByteArray'寫入'stream' - 你的'FileOutputStream'。 – 2010-01-05 03:21:04

1

看看帕維爾普的回答。

另外,我會注意到您使用VIEW意向操作安裝APK的想法確實有效,因爲我過去已經測試過這種技術。

然而,除非用戶明確已經進入設置→應用程序和選擇「允許非市場應用程序」,安裝會失敗,用戶將只能看到一個屏幕告訴他們,出於安全考慮安裝已受阻。

基本上,你真的需要依靠具有相當技術的用戶誰願意忽略了一個可怕的安全警告,並去禁用該設置。