如何摆脱异常" IOException:File' ...... ...... .pdf'无法写入"

时间:2018-02-14 05:05:54

标签: android file ioexception

我想从链接下载PDF文件,然后在pdf阅读器中打开它。为此,我表示:

    宣言中的
  • <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
    
  • AppAsyncTasks.java类中的
  • public static class FileLoadingTask extends AsyncTask<Void, Void, File> {
    
        private static final String LOG_TAG = "FileLoadingTask";
    
        public FileLoadingTask(final Context cxt,
                               final JSONOrder order,
                               final FileLoadingListener listener) {
    
        }
    
        @Override
        protected void onPreExecute() {
            super.onPreExecute();
            createPdLoading(pdLoading);
            this.url = mOrder.getPreviewlink();
            this.extStorageDirectory = Environment.getExternalStorageDirectory().toString();
            this.folder = new File(extStorageDirectory, "Download");
            this.folder.mkdir();
            this.fileName = mOrder.getOrdercode() + ".pdf";
            this.file = new File(this.folder, this.fileName);
            fileLoadingListener.onBegin();
        }
    
        @Override
        protected File doInBackground(Void... params) {
            try {
                FileUtils.copyURLToFile(new URL(url), file);
            } catch (IOException e) {        
                throwable = e;
            }
            return file;
        }
    
        @Override
        protected void onPostExecute(File file) {
            super.onPostExecute(file);
            pdLoading.dismiss();
            fileLoadingListener.onEnd(file);
            if (throwable != null) {
                fileLoadingListener.onFailure(throwable);
            } else {
                fileLoadingListener.onSuccess();
            }
        }            
        public interface FileLoadingListener {
    
            void onBegin();               
            void onSuccess();              
            void onFailure(Throwable cause);                
            void onEnd(File file);                
        }
    }
    

但是,不会将文件写入内部媒体 - 抛出异常:

  

IOException:File&#39; storage / emulated / 0 / Download / ... pdf&#39;无法写入

如何摆脱这种异常?

1 个答案:

答案 0 :(得分:0)

此解决方案可行。我在代码中包含了检查外部存储器写权限的指令。正如Tejas PandyaDhaval Patel所建议的那样。

为此,我的onPreExecute()方法添加如下:

    @Override
    protected void onPreExecute() {
        super.onPreExecute();
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
            while (checkPermissions()) {
            }
        }
        createPdLoading(pdLoading);
        ... ... ... ... ...
    }

如果没有将文件写入外部存储器的权限,则checkPermissions()方法返回值“true”,如果有,则返回“false”。

    @RequiresApi(api = Build.VERSION_CODES.M)
    private boolean checkPermissions() {
        switch (App.getCurFragContext().checkSelfPermission(Manifest.permission.WRITE_EXTERNAL_STORAGE)) {
            case PackageManager.PERMISSION_DENIED:
                fileLoadingListener.requestPermissions();
                return true;
            default:
                return false;
        }
    }

我向FileLoadingListener接口添加了requestPermissions()方法。它是从checkPermissions()方法调用的,具有以下实现:

    @Override
    public void requestPermissions() {
        ActivityCompat.requestPermissions(
                (Activity) mActivity,
                new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE},
                App.MY_PERMISSIONS_REQUEST_WRITE);
    }