Android 使用.getInputStream()时未找到文件异常

Android 使用.getInputStream()时未找到文件异常,android,Android,正在尝试使用以下代码下载远程托管的.apk文件 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.Inte

正在尝试使用以下代码下载远程托管的.apk文件

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;
}}  
无法连接,但尝试使用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>

"

这一行您错了
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();
}

您在这一行中出错了
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();
}

不要使用/sdcard/Downloads…此路径在某些设备中是不同的。 你应使用:

File file = Environment.getExternalStorageDirectory();

不要使用/sdcard/Downloads…此路径在某些设备中是不同的。 你应使用:

File file = Environment.getExternalStorageDirectory();

最终导致IIS出现问题。当我将.apk移动到apache Web服务器时,没有问题…

最终导致IIS出现问题。当我将.apk移动到apache Web服务器时,没有问题…

进行了您建议的更改,仍然收到相同的结果。我不相信我的原始代码在这一点上是错误的,因为该文件包含的内容超过了just字符串类型的构造函数。File有一个构造函数,您可以在其中传递一个文件和一个字符串。这是我在您提出建议之前使用的,两种方法都可以接受。File(File dir,string name)因为:API级别1使用指定的目录和名称构造新文件。Parameters dir存储文件的目录。命名文件名。引发异常InputStream的行是=c.getInputStream();是的,我知道你要去哪里,但当我试图从我的连接变量中提取inputstream时仍会引发异常。等一下,你的URL值是多少?我不想给出URL的实际值,但通过调试我知道传递给这里的字符串是myApp.execute(“);使它成为我的任务,我能够连接到它。而且它也可以在浏览器中工作。进行了您建议的更改,但仍然收到相同的结果。我不认为我的原始代码在这一点上是错误的,因为该文件不仅仅有一个string类型的构造函数。文件有一个构造函数,您可以在其中传递一个文件和一个字符串。这是我在你建议之前使用的,两种方法都可以接受。File(File dir,String name)因为:API级别1使用指定的目录和名称构造新文件。Parameters dir存储文件的目录。命名文件名。引发异常InputStream的行是=c.getInputStream();是的,我知道你要去哪里,但是当我试图从我的连接变量中提取inputstream时仍然抛出异常。等一下,你的URL的值是多少?我不想给出URL的实际值,但通过调试我知道传递给这里的字符串是myApp.execute(“);使其成为我的任务,我可以连接到它。它也可以在浏览器中工作。getExternalStorageDirectory();并不总是在所有硬件类型中返回外部SD卡的路径。特别是对于具有多个SD卡的设备。我碰巧使用了其中一种类型。getExternalStorageDirectory();并不总是在所有硬件类型中返回外部SD卡的路径。特别是对于具有多个SD卡的设备。我碰巧使用了其中一种类型。