【问题标题】:Android 6: error file could not be accessedAndroid 6:无法访问错误文件
【发布时间】:2017-03-06 21:50:59
【问题描述】:

我对 Android 6 的问题感到抓狂。从服务器下载 pdf 文件(在 localhost 中运行。服务器响应是 HTTP 200(所以没有发现问题),但是当我尝试打开文件时得到错误:“无法访问错误文件”

这是下载文件的Asynctack:

private class DownloadContent extends AsyncTask<String,Integer,String> {
    private Context context;
    private PowerManager.WakeLock mWakeLock;
    private String ris;

    public DownloadContent(Context context) {
        this.context = context;
    }

    @Override
    protected String doInBackground(String... params) {
        String nomefile=params[0];
        String email=params[1];
        String id=params[2];
        InputStream input = null;
        String[] saveFiles;
        OutputStream output = null;
        HttpURLConnection connection = null;
        try {
            URL url = new URL("http://192.168.1.8:8080/com.appcampus/rest/content/"+nomefile+"/"+email+"/"+id);

            connection = (HttpURLConnection) url.openConnection();
            connection.connect();

            if (connection.getResponseCode() != HttpURLConnection.HTTP_OK) {
                return "Server returned HTTP " + connection.getResponseCode()
                        + " " + connection.getResponseMessage();
            }

            int fileLength = connection.getContentLength();

            // download the file
            java.io.File xmlFile = new java.io.File(Environment
                    .getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS)
                    + "/"+nomefile);
            input = connection.getInputStream();
            int permissionCheck = ContextCompat.checkSelfPermission(getApplicationContext(),
                    Manifest.permission.WRITE_EXTERNAL_STORAGE);
            if(permissionCheck == PackageManager.PERMISSION_GRANTED){


            output = new FileOutputStream(xmlFile);
            byte data[] = new byte[4096];
            long total = 0;
            int count;
            while ((count = input.read(data)) != -1) {
                // allow canceling with back button
                if (isCancelled()) {
                    input.close();
                    return null;
                }
                total += count;
                // publishing the progress....
                if (fileLength > 0) // only if total length is known
                    publishProgress((int) (total * 100 / fileLength));
                output.write(data, 0, count);

            }
            }else{
               Log.d("Permission check",""+permissionCheck);
            }

            saveFiles = context.fileList();
            String s = "";
            for (String element : saveFiles) {
                s += " " + element;
            }

            ris = "Server returned HTTP " + connection.getResponseCode();
        } catch (Exception e) {
            return e.toString();
        } finally {
            try {
                if (output != null)
                    output.close();
                if (input != null)
                    input.close();
            } catch (IOException ignored) {
            }

            if (connection != null)
                connection.disconnect();
        }
        return ris;
    }
}

我尝试在 onCreate 方法中打开 PdfFile:

 protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
    setSupportActionBar(toolbar);

    FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab);
    fab.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {

            String risultato = "";
            Uri path = null;
            try {
                path = Uri.fromFile(new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS ),"SisDisQuestion.pdf"));

            } catch (Exception e) {
                e.printStackTrace();
            }
            DownloadContent downloadTask = new DownloadContent(MainActivity.this);
            try {

                Log.d("DOWNOALD","Sono entrato in download content");
                String[] param = {"SisDisQuestion.pdf","a","91"};
                risultato = downloadTask.execute(param).get();
                Log.d("DOWNLOAD", risultato);
                Snackbar.make(view, risultato, Snackbar.LENGTH_LONG)
                        .setAction("Action", null).show();
              //  Intent i = new Intent(SingleContentActivity.this, Main2Activity.class);
                //startActivity(i);

            } catch (InterruptedException e) {
                e.printStackTrace();
            } catch (ExecutionException e) {
                e.printStackTrace();
            }


           // if(risultato.equals("HTTP 200")){
                Intent pdfIntent = new Intent(Intent.ACTION_VIEW);
                pdfIntent.setDataAndType(path, "application/pdf");
                pdfIntent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
                pdfIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
                getApplicationContext().startActivity(pdfIntent);

           // }

        }
    });
}

而且我认为清单中的所有权限都可以:

 <uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<uses-permission android:name="android.permission.USE_CREDENTIALS" />
<!-- To retrieve the account name (email) as part of sign-in: -->
<uses-permission android:name="android.permission.GET_ACCOUNTS" />
<!-- To auto-complete the email text field in the login form with the user's emails -->
<uses-permission android:name="android.permission.READ_PROFILE" />
<uses-permission android:name="android.permission.READ_CONTACTS" />

【问题讨论】:

  • 那么原始文件有多少字节?以及下载了多少。数字!
  • risultato = downloadTask.execute(param).get();。错误的代码。不要使用 .get() 方法。而是在 onPostExecute() 中处理 doInBackground() 的结果。表现正常。
  • 我尝试在 onPostExecute 中处理结果,但没有任何改变。该请求返回 HTTP 200。我尝试使用文件资源管理器查找该文件,但在我的设备上找不到它。怎么可能?
  • 我尝试检查 if (file.exists()) 并返回 false。但与 android Lollipop 相同的代码是可以的。

标签: android android-6.0-marshmallow file-not-found


【解决方案1】:

终于找到了解决办法:我在要打开的文件路径中添加了file:///。

Uri path = Uri.parse("file:///"+Environment
                    .getExternalStorageDirectory().toString()
                    + "/YOURFILE.pdf");

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-05-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多