2012-10-03 23 views
2

我目前正在開發一款不會在Play商店中運行並需要某種更新例程的應用程序。嘗試安裝未簽名的遠程.apk文件時出現不一致的分析錯誤

我得到它的工作,所以當用戶按下按鈕時,應用程序下載託管在我們的服務器上的apk文件。這部分工作正常。這裏的有趣的東西...

當我嘗試啓動的意圖來安裝文件,我得到以下分析錯誤:

「解析錯誤有解析包時出現問題」

這無論在Android 4.0.3上發生什麼,每次都會發生錯誤。這裏是logcat:

10-03 18:36:05.212: D/asset(567): failed to open Zip archive   '/mnt/sdcard/download/AMWireless.apk' 
10-03 18:36:05.272: W/PackageParser(567): Unable to read AndroidManifest.xml of  /mnt/sdcard/download/AMWireless.apk 
10-03 18:36:05.272: W/PackageParser(567): java.io.FileNotFoundException: AndroidManifest.xml 
10-03 18:36:05.272: W/PackageParser(567): at android.content.res.AssetManager.openXmlAssetNative(Native Method) 
10-03 18:36:05.272: W/PackageParser(567): at android.content.res.AssetManager.openXmlBlockAsset(AssetManager.java:487) 
10-03 18:36:05.272: W/PackageParser(567): at android.content.res.AssetManager.openXmlResourceParser(AssetManager.java:455) 
10-03 18:36:05.272: W/PackageParser(567): at android.content.pm.PackageParser.parsePackage(PackageParser.java:425) 
10-03 18:36:05.272: W/PackageParser(567): at com.android.packageinstaller.PackageUtil.getPackageInfo(PackageUtil.java:74) 
10-03 18:36:05.272: W/PackageParser(567): at com.android.packageinstaller.PackageInstallerActivity.onCreate(PackageInstallerActivity.java:277) 
10-03 18:36:05.272: W/PackageParser(567): at android.app.Activity.performCreate(Activity.java:4465) 
10-03 18:36:05.272: W/PackageParser(567): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1049) 
10-03 18:36:05.272: W/PackageParser(567): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1920) 
10-03 18:36:05.272: W/PackageParser(567): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1981) 
10-03 18:36:05.272: W/PackageParser(567): at android.app.ActivityThread.access$600(ActivityThread.java:123) 
10-03 18:36:05.272: W/PackageParser(567): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1147) 
10-03 18:36:05.272: W/PackageParser(567): at android.os.Handler.dispatchMessage(Handler.java:99) 
10-03 18:36:05.272: W/PackageParser(567): at android.os.Looper.loop(Looper.java:137) 
10-03 18:36:05.272: W/PackageParser(567): at android.app.ActivityThread.main(ActivityThread.java:4424) 
10-03 18:36:05.272: W/PackageParser(567): at java.lang.reflect.Method.invokeNative(Native Method) 
10-03 18:36:05.272: W/PackageParser(567): at java.lang.reflect.Method.invoke(Method.java:511) 
10-03 18:36:05.272: W/PackageParser(567): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784) 
10-03 18:36:05.272: W/PackageParser(567): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551) 
10-03 18:36:05.272: W/PackageParser(567): at dalvik.system.NativeStart.main(Native Method) 
10-03 18:36:05.272: W/PackageInstaller(567): Parse error when parsing manifest. Discontinuing installation 

但是,我的更新程序工作在我的droid x2運行版本2.3.5。安裝應用程序的意圖非常好,一旦他們確認安裝的應用程序權限。

我能夠重現上2.3.5版本在這裏解析錯誤是如何:

我通常只是通過Eclipse的安裝應用程序,運行它,但如果我的包在包右鍵單擊資源管理器窗口使用android工具導出未簽名的.apk,並嘗試手動安裝該軟件包,它不會安裝。

如果我使用的.apk的是在項目bin文件夾,它安裝罰款和2.3.5

這裏更新罰款是的AsyncTask類使用:

public class UpdateWireless extends AsyncTask<String,Void,String>{ 
private Context context; 
public void setContext(Context contextf){ 
context = contextf; 
} 
@Override 
protected String 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 = Environment.getExternalStorageDirectory().getAbsolutePath()+"/download/"; 
File oldFile = new File(Environment.getExternalStorageDirectory().getAbsolutePath()+"/download/AMWireless.apk"); 
if(oldFile.exists()) 
{ 
oldFile.delete(); 
} 
File file = new File(PATH); 
file.mkdirs(); 
File outputFile = new File(file, "AMWireless.apk"); 
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(); 
} catch (IOException e){ 
} 
return "File Saved"; 
} 
protected void onPostExecute(String result) { 
Intent intent = new Intent(Intent.ACTION_VIEW); 
intent.setDataAndType(Uri.fromFile(new  File(Environment.getExternalStorageDirectory().getAbsolutePath()+"/download/"+"AMWireless.apk")), "application/vnd.android.package-archive"); 
startActivity(intent); 
} 

} 

是的,我需要的東西,但是在catch塊,但我們會到達那裏......

這裏是我的清單:

<?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.INSTALL_PACKAGES"/> 
    <uses-permission android:name="android.permission.DELETE_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> 

我從Eclipse導出東西錯了嗎?這是一個明顯的問題嗎?我正在做這個權利嗎?

編輯1: 好吧範圍縮小到更多的問題一點與這條線在Android 4.0.3:

InputStream is = c.getInputStream(); 

此行拋出了一個文件,未發現異常,如它可以沒有看到我的服務器上的文件,它從來沒有下載。安卓2.3.5看到文件沒有例外,並下載並安裝罰款...這裏有什麼問題?

編輯2:議決 我本來想主辦,是由IIS提供服務的網站上的文件,和老版本的Android也沒在意,但新版本將無法看到文件。一旦我將.apk移動到運行apache的Web服務器,我就沒有問題了。所以,有些東西是可疑的IIS或可能我的配置....

回答

0

回答了我自己的問題。是我在哪裏託管文件的問題。 IIS和Android不會一起玩:解決方案:將.apk文件移動到apache服務器。

相關問題