Android Q引入了Scoped Storage(作用域存储)的概念,对应用程序的访问权限进行了限制。在Android Q中,公共路径已经不再直接公开给应用程序使用,而是通过MediaStore API来访问。
以下是一个示例代码,展示如何使用MediaStore API来获取Android Q的公共路径:
import android.content.ContentUris;
import android.content.Context;
import android.database.Cursor;
import android.net.Uri;
import android.os.Build;
import android.provider.MediaStore;
import android.util.Log;
public class PublicPathUtils {
private static final String TAG = "PublicPathUtils";
public static Uri getPublicPath(Context context, String fileName) {
Uri uri = null;
Cursor cursor = null;
try {
// 查询公共图像库
cursor = context.getContentResolver().query(
MediaStore.Images.Media.EXTERNAL_CONTENT_URI,
new String[]{MediaStore.Images.Media._ID},
MediaStore.Images.Media.DISPLAY_NAME + "=?",
new String[]{fileName},
null);
if (cursor != null && cursor.moveToFirst()) {
long id = cursor.getLong(cursor.getColumnIndex(MediaStore.Images.Media._ID));
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
// Android Q及以上版本需要使用ContentUris工具类来获取uri
uri = ContentUris.withAppendedId(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, id);
} else {
// Android Q以下版本可以直接使用Uri.fromFile方法
uri = Uri.withAppendedPath(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, String.valueOf(id));
}
}
} catch (Exception e) {
Log.e(TAG, "Failed to get public path: " + e.getMessage());
} finally {
if (cursor != null) {
cursor.close();
}
}
return uri;
}
}
上述示例代码中,我们通过查询MediaStore.Images.Media.EXTERNAL_CONTENT_URI来获取公共图像库中指定文件名的Uri。如果是Android Q及以上版本,我们使用ContentUris工具类来构建Uri,否则可以直接使用Uri.fromFile方法。
请注意,使用MediaStore API访问公共路径需要相应的权限声明,例如在AndroidManifest.xml文件中添加以下权限:
希望这个示例代码能够帮助到您!