(转载仅作记录)解决android11 Uri解码Id包含msf不能转Long的问题

原文:https://blog.csdn.net/jingzz1/article/details/106188462

//android10以上 uri转file uri转真实路径
if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.Q) {
   File path = FileUtils.uriToFileApiQ(uri, this);
}
/**
     * android10以上 uri转file uri转真实路径
     * @param uri
     * @param context
     * @return
     */
    @RequiresApi(api = Build.VERSION_CODES.Q)
    public static File uriToFileApiQ(Uri uri, Context context) {
        File file = null;
        if(uri == null) return file;
        //android10以上转换
        if (uri.getScheme().equals(ContentResolver.SCHEME_FILE)) {
            file = new File(uri.getPath());
        } else if (uri.getScheme().equals(ContentResolver.SCHEME_CONTENT)) {
            //把文件复制到沙盒目录
            ContentResolver contentResolver = context.getContentResolver();
            String displayName = System.currentTimeMillis()+ Math.round((Math.random() + 1) * 1000)
                    +"."+ MimeTypeMap.getSingleton().getExtensionFromMimeType(contentResolver.getType(uri));
            try {
                InputStream is = contentResolver.openInputStream(uri);
                File cache = new File(context.getCacheDir().getAbsolutePath(), displayName);
                FileOutputStream fos = new FileOutputStream(cache);
                //android.os.FileUtils不是工具类,是Android的SDK方法
                android.os.FileUtils.copy(is, fos);
                file = cache;
                fos.close();
                is.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        return file;
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 在Android 11中,由于对隐私保护的增强,当应用程序尝试访问其他应用程序的文件时,必须使用URI进行访问。要将URI换为字符串,请使用以下代码: ```java String uriToString(Uri uri) { if (uri == null) { return null; } return uri.toString(); } ``` 您可以将URI传递给此方法,并返回URI的字符串表示形式。 ### 回答2: 在Android 11中,将URI换为字符串的方法与之前的版本略有不同。以下是在Android 11中使用Java代码将URI换为字符串的步骤: 1. 获取ContentResolver对象: ```java ContentResolver contentResolver = getContentResolver(); ``` 2. 使用ContentResolver对象的`takePersistableUriPermission`方法来请求永久的URI访问权限。这样做是为了避免在将URI换为字符串时出现安全权限问题: ```java contentResolver.takePersistableUriPermission(uri, Intent.FLAG_GRANT_READ_URI_PERMISSION); ``` 3. 使用DocumentsContract类的`getDocumentId`方法来获取URI的文档ID: ```java String documentId = DocumentsContract.getDocumentId(uri); ``` 4. 使用String类的`split`方法将文档ID拆分为两个部分:authority和documentId: ```java String[] splits = documentId.split(":"); String authority = splits[0]; String id = splits[1]; ``` 5. 使用ContentUris类的`withAppendedId`方法将authority和id重新组合为内容URI: ```java Uri contentUri = ContentUris.withAppendedId(Uri.parse("content://" + authority + "/document"), Long.parseLong(id)); ``` 6. 使用ContentResolver对象的`query`方法获取URI的实际数据: ```java Cursor cursor = contentResolver.query(contentUri, null, null, null, null); ``` 7. 使用Cursor对象获取数据列索引,然后使用`getString`方法获取URI的字符串表示: ```java int dataIndex = cursor.getColumnIndex(OpenableColumns.DISPLAY_NAME); cursor.moveToFirst(); String fileName = cursor.getString(dataIndex); ``` 至此,我们成功将URI换为字符串。 ### 回答3: 在Android 11中,将URI换为字符串可以通过Uri的toString()方法来完成。该方法返回一个表示URI的字符串。 具体的代码示例如下: ```java Uri uri = ...; // 假设已经获取到URI String uriString = uri.toString(); // 将URI换为字符串 ``` 在上述代码中,需要先使用某种方式获取到要换的URI。然后,通过调用URI的toString()方法,将其换为字符串并将结果赋给一个字符串变量。 值得注意的是,如果URI对象为null,调用toString()方法将抛出NullPointerException异常。因此,在调用toString()方法之前,需要确保URI对象不为空。 以上就是在Android 11中将URI换为字符串的方法。这样,你就可以方便地将URI进行字符串处理、显示或传递给其他地方使用。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值