使用之前的方式进行文件存储会得到如下错误

FileNotFoundException open failed: EPERM (Operation not permitted)

就是无法获取文件路径了

推荐在Android11及以上版本使用Storage Access Framework (SAF)操作文件

注意,只可以在Android11及以上版本中使用

/**
 * Android 11 及以上选择文件导出
 */
private static final int REQUEST_CODE_ANDROID_11_OR_HIGHER_FILE_SELECT_FOR_OUTPUT = 5;

/**
 * 文件后缀
 */
private static final String POSTFIX = ".xlsx";

...

/**
 * Android11及以上文件选择
 */
private void android11OrHigherFileSelect() {
    Intent intent = new Intent(Intent.ACTION_CREATE_DOCUMENT);
    intent.addCategory(Intent.CATEGORY_OPENABLE);
    intent.setType("application/xlsx");
    // 设置默认文件名
    String time = TimeUtils.date2String(new Date(), "yyyy-MM-dd HH:mm:ss");
    intent.putExtra(Intent.EXTRA_TITLE, "新文件" + time + POSTFIX);
    // 用户进行文件存储位置选择
    startActivityForResult(intent, REQUEST_CODE_ANDROID_11_OR_HIGHER_FILE_SELECT_FOR_OUTPUT);
}

@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    if (resultCode == RESULT_OK && data != null) {
    	// 通过Uri进行文件处理
    	if (requestCode == REQUEST_CODE_ANDROID_11_OR_HIGHER_FILE_SELECT_FOR_OUTPUT) {
    		Uri uri = data.getData();
    		// 柯基的工具类
            File file = com.blankj.utilcode.util.UriUtils.uri2File(uri);
            // 进行写文件...
            doDataOutput(file.getPath());
        }
    }
}
Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐