首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >打开pdf文件错误:无法访问此文件,请检查位置或网络,然后重试。Android 6马斯马洛

打开pdf文件错误:无法访问此文件,请检查位置或网络,然后重试。Android 6马斯马洛
EN

Stack Overflow用户
提问于 2016-07-02 10:39:26
回答 4查看 16.9K关注 0票数 6

我正在尝试从外部存储获取文件,然后我必须使用意图将该文件发送给pdf阅读器。以前,下面的代码运行良好,但是在安装了Android 6 (Marshmallow )之后,我的代码就不工作了,并且收到了一条祝酒词。

无法访问此文件,请检查位置或网络,然后重试。”

(这是由于新的android运行时权限)。我刚刚尝试了所有的解决方案(内容提供商等,但没有工作),有什么解决方案吗?

代码语言:javascript
运行
复制
 File file = new File(getFilesDir(), "myfile.pdf");
 Intent intent = new Intent(Intent.ACTION_VIEW);
        intent.setDataAndType(Uri.fromFile(file), "application/pdf");
        intent.setFlags(Intent.FLAG_ACTIVITY_NO_HISTORY);
        Intent intentChooser = Intent.createChooser(intent, "Choose Pdf Application");
        try {
            startActivity(intentChooser);
        } catch (ActivityNotFoundException e) {
            //com.adobe.reader
            startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse("https://play.google.com/store/apps/details?id=com.adobe.reader")));
        }
EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2016-07-02 10:46:23

刚刚为以前的和新的Android操作系统找到了一个可行的解决方案:

创建类名SampleContentProvider步骤1:

代码语言:javascript
运行
复制
import android.content.ContentProvider;
import android.content.ContentValues;
import android.database.Cursor;
import android.net.Uri;
import android.os.ParcelFileDescriptor;

import java.io.File;
import java.io.FileNotFoundException;

/**
 * Created by naveed on 7/2/16.
 */
public class SampleContentProvider extends ContentProvider {

    @Override
    public ParcelFileDescriptor openFile(Uri uri, String mode) throws FileNotFoundException {
        File privateFile = new File(uri.getPath());
        return ParcelFileDescriptor.open(privateFile, ParcelFileDescriptor.MODE_READ_ONLY);
    }

    @Override
    public boolean onCreate() {
        return false;
    }

    @Override
    public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) {
        return null;
    }

    @Override
    public String getType(Uri uri) {
        return null;
    }

    @Override
    public Uri insert(Uri uri, ContentValues values) {
        return null;
    }

    @Override
    public int delete(Uri uri, String selection, String[] selectionArgs) {
        return 0;
    }

    @Override
    public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs) {
        return 0;
    }
}

Step2:清单应用程序主体中添加提供程序

代码语言:javascript
运行
复制
<provider
        android:name=".SampleContentProvider"
        android:authorities="your_package_name"
        android:exported="true" />

步骤3:现在通过使用Uri将文件绝对路径传递给意图

代码语言:javascript
运行
复制
  Intent intent = new Intent(Intent.ACTION_VIEW);
        File file = new File(getFilesDir(), "myfile.pdf");
        String absoluteFilePath = file.getAbsolutePath();
        String mimeType = "application/pdf";
        Uri uri = Uri.parse("content://"+"Your_package_name"+"/" + absoluteFilePath);
        intent.setDataAndType(uri, mimeType);
        Intent intentChooser = Intent.createChooser(intent, "Choose Pdf Application");
        startActivity(intentChooser);

我希望这能帮到你。谢谢大家的帮助。

票数 4
EN

Stack Overflow用户

发布于 2017-05-18 19:48:56

在回顾了上面的答案之后,最简单的解决方案如下。

代码语言:javascript
运行
复制
    Uri pdf = FileProvider.getUriForFile(this, this.getApplicationContext().getPackageName() + ".provider", file);

    Intent pdfOpenintent = new Intent(Intent.ACTION_VIEW);
    pdfOpenintent.setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION | Intent.FLAG_ACTIVITY_CLEAR_TOP);
    pdfOpenintent.setDataAndType(pdf, "application/pdf");

    try {
        startActivity(pdfOpenintent);
    } catch (ActivityNotFoundException e) {
        // handle no application here....
    }

关键是同时设置FLAG_GRANT_READ_URI_PERMISSION和FLAG_ACTIVITY_CLEAR_TOP。

确保在ApplicationManifest.xml中声明提供程序

代码语言:javascript
运行
复制
<provider
        android:name="android.support.v4.content.FileProvider"
        android:authorities="${applicationId}.provider"
        android:exported="false"
        android:grantUriPermissions="true">
        <meta-data
            android:name="android.support.FILE_PROVIDER_PATHS"
            android:resource="@xml/provider_paths"/>
    </provider>

她的是provider_paths文件

代码语言:javascript
运行
复制
<?xml version="1.0" encoding="utf-8"?>
<paths>
    <external-path name="external_files" path="."/>
</paths>
票数 12
EN

Stack Overflow用户

发布于 2017-04-26 14:02:57

使用FileProvider (不管怎么说,这是自Android以来公认的方法--否则您将得到android.os.FileUriExposedException),然后不要忘记为它需要的所有包授予权限

代码语言:javascript
运行
复制
Uri uri = FileProvider.getUriForFile(
                                context,
                                context.getApplicationContext().getPackageName(), myFile);

                        Intent pdfIntent = new Intent(Intent.ACTION_VIEW);
                        pdfIntent.setDataAndType(apkURI, "application/pdf");
                        pdfIntent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
                        pdfIntent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
                        grantAllUriPermissions(context, pdfIntent, apkURI);

其中grantAllUriPermissions()

代码语言:javascript
运行
复制
private void grantAllUriPermissions(Context context, Intent intent, Uri uri) {
        List<ResolveInfo> resInfoList = context.getPackageManager().queryIntentActivities(intent, PackageManager.MATCH_DEFAULT_ONLY);
        for (ResolveInfo resolveInfo : resInfoList) {
            String packageName = resolveInfo.activityInfo.packageName;
            context.grantUriPermission(packageName, uri, Intent.FLAG_GRANT_WRITE_URI_PERMISSION | Intent.FLAG_GRANT_READ_URI_PERMISSION);
        }
}
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38159187

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档