Android 未在牛轧糖上打开PDF文件+;

Android 未在牛轧糖上打开PDF文件+;,android,pdf,Android,Pdf,我正在创建一个应用程序,在这个应用程序中有一个按钮,可以打开一个PDF,其中包含用户活动的日历 PDF位于“资源”文件夹中 实际代码是: private void abrirCalendario() { AssetManager assetManager = getAssets(); File fileDir = new File(Environment.getExternalStorageDirectory().getPath() + "/");

我正在创建一个应用程序,在这个应用程序中有一个按钮,可以打开一个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);
    }
private void abricalendario(){
AssetManager AssetManager=getAssets();
File fileDir=新文件(Environment.getExternalStorageDirectory().getPath()+“/”;
fileDir.mkdirs();
File File=新文件(fileDir,“Calendario DAERG.pdf”);
String path=Environment.getExternalStorageDirectory().getPath()+“/Calendario DAERG.pdf”;
意向意向=新意向(意向.行动\视图);
Uri;
if(Build.VERSION.SDK\u INT>=Build.VERSION\u code.N){
uri=FileProvider.getUriForFile(这是getPackageName()+“.provider”,新文件(路径));
List resinfo List=getPackageManager().queryInputActivities(intent,PackageManager.MATCH_DEFAULT_仅限);
对于(ResolveInfo ResolveInfo:ResInfo列表){
字符串packageName=“tk.davidev.android.ews”;
grantUriPermission(packageName、uri、Intent.FLAG_GRANT_uri_PERMISSION | Intent.FLAG_GRANT_READ_uri_PERMISSION);
}
}否则{
uri=uri.fromFile(新文件(路径));
}
如果(!file.exists()){
试一试{
InputStream in=assetManager.open(“calendario_2017.pdf”);
OutputStream out=新的BufferedOutputStream(新文件OutputStream(文件));
复制文件(输入、输出);
in.close();
out.flush();
out.close();
}捕获(例外e){
}
}
setDataAndType(uri,“应用程序/pdf”);
intent.setFlags(intent.FLAG\u活动\u新任务);
星触觉(意向);
}
我得到的错误是:
file:///storage/emulated/0/Calendario DAERG.pdf通过Intent.getData()在应用程序之外公开,我认为这是因为来自Mashmellow的Android改变了其顺序行为,例如在运行时请求权限或使用FileProvider管理URI。现在我必须在某些代码中授予权限才能工作。
这是一个在牛轧糖中用行动观点表达开放意图的例子

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授予权限

intent.setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION | Intent.FLAG_GRANT_WRITE_URI_PERMISSION); 
我给您留下这个链接是为了了解这个新实现的背景知识。 另外,我按照这个anwser从asset中读取了我的file.pdf文件 希望能帮忙,问候