PDF文件未在Nougat +上打开

时间:2017-05-27 14:52:08

标签: android pdf

我正在创建一个应用程序,并且在此应用程序中有一个按钮,用于打开带有用户活动日历的PDF ...

PDF位于资产文件夹中。

实际代码是:

    private void abrirCalendario() {
        AssetManager assetManager = getAssets();
        File fileDir = new File(Environment.getExternalStorageDirectory().getPath() + "/");
        fileDir.mkdirs();
        File file = new File(fileDir, "Calendario DAERG.pdf");
        String path = Environment.getExternalStorageDirectory().getPath() + "/Calendario DAERG.pdf";
        Intent intent = new Intent(Intent.ACTION_VIEW);
        Uri uri;
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
            uri = FileProvider.getUriForFile(this, getPackageName() + ".provider", new File(path));

            List<ResolveInfo> resInfoList = getPackageManager().queryIntentActivities(intent, PackageManager.MATCH_DEFAULT_ONLY);
            for (ResolveInfo resolveInfo : resInfoList) {
                String packageName = "tk.davidev.android.ews";
                grantUriPermission(packageName, uri, Intent.FLAG_GRANT_WRITE_URI_PERMISSION | Intent.FLAG_GRANT_READ_URI_PERMISSION);
            }
        }else {
            uri = Uri.fromFile(new File(path));
        }

        if(!file.exists()) {
            try {
                InputStream in = assetManager.open("calendario_2017.pdf");
                OutputStream out = new BufferedOutputStream(new FileOutputStream(file));
                copyFile(in, out);
                in.close();
                out.flush();
                out.close();
            } catch (Exception e) {
            }
        }
        intent.setDataAndType(uri, "application/pdf");

        intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);

        startActivity(intent);
    }

我得到的错误是: file:///storage/emulated/0/Calendario DAERG.pdf exposed beyond app through Intent.getData()

1 个答案:

答案 0 :(得分:0)

大家好,因为我认为来自Mashmellow的Android会改变其细分行为,例如在运行时请求权限或使用FileProvider来管理URI。现在我必须在某些代码中给予许可才能工作。 这是在Nougat中使用ACTION_VIEW打开Intent的一个例子

File archivo= new File(getExternalFilesDir(Environment.DIRECTORY_PICTURES),"excerpt_DEC.pdf");    
Uri  uri = FileProvider.getUriForFile(this,
                    "com.example.android.fileprovider",
                    archivo);  
Intent intent = new Intent(Intent.ACTION_VIEW);
intent.setDataAndType(uri,"application/pdf");
intent.setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION | Intent.FLAG_GRANT_WRITE_URI_PERMISSION);
startActivity(intent);

我的例子和你的一样。我从资产中读取了一个文件然后,我发现该文件已创建并保存在 archivo 对象中。稍后,使用FileProvider方法获取一个uri,最后,我赋予使用此行的意图权限

intent.setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION | Intent.FLAG_GRANT_WRITE_URI_PERMISSION); 

我留下这个链接,了解有关此新实施的背景知识。 https://developer.android.com/reference/android/support/v4/content/FileProvider.html 另外,我跟着这个anwser从资产中读取了我的file.pdf https://stackoverflow.com/a/7495078/8650422 希望能有所帮助,问候!