首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

在Android 11中从最近使用的文件夹中选择PDF文件时,会出现NulllPointException:Uri

在Android 11中,当你尝试从最近使用的文件夹中选择PDF文件时遇到NullPointerException: Uri错误,这通常是由于URI处理不当或权限问题引起的。以下是解决这个问题的详细步骤和原因分析:

基础概念

  • URI(Uniform Resource Identifier):用于标识资源的字符串,常用于访问文件、网络资源等。
  • NullPointerException:Java中常见的运行时异常,表示尝试访问一个空对象的属性或方法。

可能的原因

  1. 权限问题:Android 11对文件访问权限有更严格的要求,需要显式请求存储权限。
  2. URI解析问题:URI可能为空或格式不正确,导致解析失败。
  3. 文件选择器问题:文件选择器返回的URI可能不正确或不完整。

解决方法

1. 请求存储权限

在Android 11中,需要显式请求存储权限。可以在AndroidManifest.xml中添加以下权限声明:

代码语言:txt
复制
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>

然后在代码中请求权限:

代码语言:txt
复制
if (ContextCompat.checkSelfPermission(this, Manifest.permission.READ_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) {
    ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.READ_EXTERNAL_STORAGE}, REQUEST_CODE);
}

2. 处理URI

确保URI不为空且格式正确。可以在获取URI后进行检查:

代码语言:txt
复制
Uri selectedUri = data.getData();
if (selectedUri != null) {
    // 处理URI
} else {
    Log.e("URI Error", "Selected URI is null");
}

3. 使用ContentResolver解析URI

使用ContentResolver来解析URI并读取文件内容:

代码语言:txt
复制
try {
    ContentResolver contentResolver = getContentResolver();
    InputStream inputStream = contentResolver.openInputStream(selectedUri);
    if (inputStream != null) {
        // 读取文件内容
        inputStream.close();
    } else {
        Log.e("File Error", "Failed to open input stream");
    }
} catch (IOException e) {
    e.printStackTrace();
}

示例代码

以下是一个完整的示例代码,展示了如何请求权限并处理URI:

代码语言:txt
复制
public class MainActivity extends AppCompatActivity {
    private static final int REQUEST_CODE = 123;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        if (ContextCompat.checkSelfPermission(this, Manifest.permission.READ_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) {
            ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.READ_EXTERNAL_STORAGE}, REQUEST_CODE);
        } else {
            openFilePicker();
        }
    }

    private void openFilePicker() {
        Intent intent = new Intent(Intent.ACTION_GET_CONTENT);
        intent.setType("application/pdf");
        startActivityForResult(intent, REQUEST_CODE);
    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        if (requestCode == REQUEST_CODE && resultCode == RESULT_OK) {
            Uri selectedUri = data.getData();
            if (selectedUri != null) {
                try {
                    ContentResolver contentResolver = getContentResolver();
                    InputStream inputStream = contentResolver.openInputStream(selectedUri);
                    if (inputStream != null) {
                        // 读取文件内容
                        inputStream.close();
                    } else {
                        Log.e("File Error", "Failed to open input stream");
                    }
                } catch (IOException e) {
                    e.printStackTrace();
                }
            } else {
                Log.e("URI Error", "Selected URI is null");
            }
        }
    }

    @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);
        if (requestCode == REQUEST_CODE && grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
            openFilePicker();
        } else {
            Toast.makeText(this, "Permission denied", Toast.LENGTH_SHORT).show();
        }
    }
}

参考链接

通过以上步骤,你应该能够解决在Android 11中选择PDF文件时出现的NullPointerException: Uri错误。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

  • ubuntu7.10安装到3D开启

    累了好几天,重装了十几遍终于把ubuntu7.10搞定到了我自认为完美的状态了。现在总结一下安装过程(按操作顺序记录): 1.在xp下不管用pqmajac还是其他硬盘分区工具分出10G的空余分区来(实验阶段10G尝试下),不知道是不是必须得把空余分区放到硬盘的最后,似乎用中间分区会出现安装错误。 2.开始安装,简单步骤省略...这里注意的是分区时,一个swap:2G,logical,结束。一个/,ext3,8G,开始。还有就是安装过程中保持网络通畅,因为过程中要下载语言包支持。 3.安装结束。 ----------- 为了避免在以后的配置过程中出现错误,这里推荐用clonezilla live(ghost 4 linux)做备份,clonezilla下载地址:[url]http://clonezilla.sourceforge.net/download/sourceforge/[/url] 下载*.iso刻张碟子出来,从碟子启动进入clonezilla live进行备份,使用还是相当简单的。 ----------- 4.用clonezilla live做一次备份,起名original 5.装好ubuntu7.10后,第一件事情就是安装源了: sudo cp /etc/apt/sources.list /etc/apt/sources.list_backup sudo gedit /etc/apt/sources.list 将内容全部替换成: deb [url]http://ubuntu.cn99.com/ubuntu[/url] gutsy main restricted universe multiverse deb-src [url]http://ubuntu.cn99.com/ubuntu[/url] gutsy main restricted universe multiverse deb [url]http://ubuntu.cn99.com/ubuntu[/url] gutsy-backports main restricted universe multiverse deb-src [url]http://ubuntu.cn99.com/ubuntu[/url] gutsy-backports main restricted universe multiverse deb [url]http://ubuntu.cn99.com/ubuntu[/url] gutsy-proposed main restricted universe multiverse deb-src [url]http://ubuntu.cn99.com/ubuntu[/url] gutsy-proposed main restricted universe multiverse deb [url]http://ubuntu.cn99.com/ubuntu[/url] gutsy-security main restricted universe multiverse deb-src [url]http://ubuntu.cn99.com/ubuntu[/url] gutsy-security main restricted universe multiverse deb [url]http://ubuntu.cn99.com/ubuntu[/url] gutsy-updates main restricted universe multiverse deb-src [url]http://ubuntu.cn99.com/ubuntu[/url] gutsy-updates main restricted universe multiverse ----更新软件包: sudo apt-get update sudo apt-get dist-upgrade --------------------------------这里更新软件包需要漫长的时间(取决于网速了) 可以在这个时候作一些比较简单的配置: ------------ 把桌面,把计算机、主文件夹、回收站放到桌面上,把挂载的卷去掉: gconf-editor 到/apps/nautilus/desktop/分支下,去掉volumes_visible前面的复选框,勾上trash_icon_visible,home_icon_visible,computer_icon_visible前面的复选框。 ------------ 调整上下任务栏里面的内容 ------------ 开通root登录: 1.修改root密码: sudo passwd root 2.系统->系统管理->登录窗口,在安全选项卡里“允许本地系统管理员登录”打勾 以后就可以通过切换用户从登录窗口用root权限登录

    08
    领券