2012-09-19 66 views
1

嘗試使用以下代碼下載遠程託管的.apk文件。使用.getInputStream()時發現文件異常

package com.wireless.wmaa; 

import java.io.File; 
import java.io.FileOutputStream; 
import java.io.InputStream; 
import java.net.HttpURLConnection; 
import java.net.URL; 

import android.content.Context; 
import android.content.Intent; 
import android.net.Uri; 
import android.os.AsyncTask; 
import android.util.Log; 

public class UpdateApp extends AsyncTask<String,Void,Void>{ 
private Context context; 
public void setContext(Context contextf){ 
    context = contextf; 
} 

@Override 
protected Void doInBackground(String... arg0) { 
     try { 
      URL url = new URL(arg0[0]); 
      HttpURLConnection c = (HttpURLConnection) url.openConnection(); 
      c.setRequestMethod("GET"); 
      c.setDoOutput(true); 
      c.connect(); 

      String PATH = "/sdcard/Download/"; 
      File file = new File(PATH); 
      file.mkdirs(); 
      File outputFile = new File(file, "Wireless.apk"); 
      if(outputFile.exists()){ 
       outputFile.delete(); 
      } 
      FileOutputStream fos = new FileOutputStream(outputFile); 

      InputStream is = c.getInputStream(); 


      byte[] buffer = new byte[1024]; 
      int len1 = 0; 
      while ((len1 = is.read(buffer)) != -1) { 
       fos.write(buffer, 0, len1); 
      } 
      fos.close(); 
      is.close(); 

      Intent intent = new Intent(Intent.ACTION_VIEW); 
      intent.setDataAndType(Uri.fromFile(new    File("/sdcard/Download/Wireless.apk")), "application/vnd.android.package-archive"); 
      intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); // without this flag  android returned a intent error! 
      context.startActivity(intent); 


     } catch (Exception e) { 
      Log.e("UpdateAPP", "Update error! " + e.getMessage()); 
     } 
    return null; 
}} 

,這裏是啓動任務的代碼:

UpdateApp myApp = new UpdateApp(); 
myApp.setContext(getApplicationContext()); 
myApp.execute("http://some.domain.com/someSite/some.apk"); 

能夠連接,但試圖使用的InputStream時拋出未發現異常的文件。我可以從Android默認瀏覽器瀏覽到該文件,並提示我下載與我的應用程序中的功能相同的文件。這裏是我的清單:

<?xml version="1.0" encoding="utf-8"?> 
<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
    package="com.wireless.wmaa" 
    android:versionCode="1" 
    android:versionName="1.0" > 

    <uses-sdk android:minSdkVersion="10" /> 
    <uses-feature android:name="android.hardware.camera" /> 
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />  
    <uses-permission android:name="android.permission.CAMERA" /> 
    <uses-permission android:name="android.permission.INTERNET" /> 
    <uses-permission android:name="android.permission.DELETE_PACKAGES" /> 
    <uses-permission android:name="android.permission.INSTALL_PACKAGES" /> 
    <application 
     android:icon="@drawable/ic_launcher" 
     android:label="@string/app_name" 
             > 
     <activity 
      android:label="@string/app_name" 
      android:name=".SelectServer" 
      android:theme="@android:style/Theme.NoTitleBar" 
      android:screenOrientation="landscape" > 
      <intent-filter> 
       <action android:name="android.intent.action.MAIN" /> 
       <category android:name="android.intent.category.LAUNCHER" /> 
      </intent-filter>" 
      </activity> 
     <activity 
      android:name=".UpdateApp" 
      android:label="@string/app_name" 
      android:theme="@android:style/Theme.NoTitleBar" 
      android:screenOrientation="landscape" > 
      <intent-filter> 
      </intent-filter> 
     </activity> 

     <activity 
      android:name=".WirelessActivity" 
      android:label="@string/app_name" 
      android:theme="@android:style/Theme.NoTitleBar" 
      android:screenOrientation="landscape" > 
      <intent-filter> 
      </intent-filter> 
     </activity> 
    </application> 


</manifest> 

回答

0

結束了與IIS的問題。一旦我將我的.apk移動到我的apache web服務器上沒有問題...

1

你錯了,在這條線File outputFile = new File(file, "Wireless.apk");

只是改變了它,如下所示,

File outputFile = new File(PATH + "Wireless.apk"); 

也更改下面的代碼

if(outputFile.exists()) 
{ 
    outputFile.delete(); 
} 
else // Add Else part, it is missing in your code 
{ 
    outputFile.createNewFile(); 
} 
+0

進行了您所建議的更改並仍然收到相同的結果。我不相信我的原始代碼在這一點上是錯誤的,因爲File不僅僅是一個字符串類型的構造函數。文件有一個構造函數,您可以在其中傳遞一個文件和一個字符串。在您的建議之前,我正在使用哪種方式,兩種方式都可以接受。文件(文件目錄,字符串名稱) 因爲:API級別1 使用指定的目錄和名稱構造新文件。 參數 dir存儲文件的目錄。 命名文件的名稱。 – Adam

+0

引發異常InputStream的行是= c.getInputStream(); – Adam

+0

@亞當,我已經更新了我的答案,請檢查它。 – Lucifer

0

不要使用/sdcard/Downloads...這個路徑在一些設備中是不同的。 你應該使用:

File file = Environment.getExternalStorageDirectory(); 
+0

getExternalStorageDirectory();並不總是返回到所有硬件類型的外部SD卡的路徑,特別是對於具有m多重SD卡。我碰巧正在使用這些類型之一。 – Adam