我想在android中以编程方式下载文件但是在运行时,它关闭了吗?

时间:2014-02-25 07:39:07

标签: java android urlconnection

我认为我的连接失败但我无法修复代码。

URL url = new URL( imageURL);
File file = new File(fileName);
URLConnection ucon = url.openConnection();
InputStream is = ucon.getInputStream();
BufferedInputStream bis = new BufferedInputStream(is);

当调试它在这部分代码中崩溃时。 我用

<uses-permission android:name="android.permission.INTERNET"/>

<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>

3 个答案:

答案 0 :(得分:2)

在setContentView(R.layout.activity_main)之后将下面的代码写入MainActivity

 if (android.os.Build.VERSION.SDK_INT > 9) {
        StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build();
        StrictMode.setThreadPolicy(policy);
    }

答案 1 :(得分:0)

在android 3.0以上,您需要在单独的线程中完成所有网络连接。 因此,如果您在main thred中尝试该代码,它将抛出NetworkOnMainThread异常。

尝试此验证:

try{
    URL url = new URL( imageURL);
    File file = new File(fileName);
    URLConnection ucon = url.openConnection();
    InputStream is = ucon.getInputStream();
    BufferedInputStream bis = new BufferedInputStream(is);
}
catch (android.os.NetworkOnMainThreadException ex){
    // Skipp.
}

如果您的应用没有以这种方式崩溃,那么您需要使用AssyncTask进行网络连接。 Here is a good examplehow to

并且不要忘记检查你的文件路径,就像@LucianNovac建议的那样。

答案 2 :(得分:0)

尝试像这样初始化文件:

File extStore = Environment.getExternalStorageDirectory();
File file = new File(extStore, fileName);

并且不要忘记输入您的清单文件

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>

另外要避免网络异常,请将其放入asynk

class DownloadMyFIle extends AsyncTask<String, Void, DownloadProcess> {

    private Exception exception;

    protected DownloadProcess doInBackground(String... urls) {
        try {
            File extStore = Environment.getExternalStorageDirectory();
            File file = new File(extStore, fileName);
            ....
        } catch (Exception e) {
            this.exception = e;
            return null;
        }
    }

    protected void onPostExecute(DownloadProcess process) {
        // TODO: check this.exception 

    }
}