Java Android从ID获取媒体图像Uri
我是Android和Java新手,本周我一直在自学速成课程。到目前为止,我所学到的并不是太复杂,因为我已经积累了多年的编码经验。所以,把背景历史放在一边,转到我的问题上 下面的代码是我编写的两个函数,用于从数据库获取图像ID,并解析正确的Uri,然后使用该Uri将照片上载到网站。所以,你们这些好心的人可以看看我的代码,让我知道我是否做得很糟糕,或者我是否朝着正确的方向前进,或者是否有更好的/本地的方法来做我需要的事情 另外,请注意:下面的代码不起作用。我只是不知道这样做是否正确 谢谢Java Android从ID获取媒体图像Uri,java,android,Java,Android,我是Android和Java新手,本周我一直在自学速成课程。到目前为止,我所学到的并不是太复杂,因为我已经积累了多年的编码经验。所以,把背景历史放在一边,转到我的问题上 下面的代码是我编写的两个函数,用于从数据库获取图像ID,并解析正确的Uri,然后使用该Uri将照片上载到网站。所以,你们这些好心的人可以看看我的代码,让我知道我是否做得很糟糕,或者我是否朝着正确的方向前进,或者是否有更好的/本地的方法来做我需要的事情 另外,请注意:下面的代码不起作用。我只是不知道这样做是否正确 谢谢 // Us
// Usage Map idPath = ImageIdPathFetcher.getRealIdPathFromID(getApplicationContext(), Integer.valueOf(image_id));
public static Map getRealIdPathFromID(Context context, Integer id) {
Map<String,String> idPath = new HashMap<String, String>();
Uri external_images_uri = MediaStore.Images.Media.getContentUri("external");
Uri internal_images_uri = MediaStore.Images.Media.getContentUri("internal");
// initialize uri
Uri uri = external_images_uri;
String ext_img_uri = external_images_uri.toString()+"/"+id;
String int_img_uri = internal_images_uri.toString()+"/"+id;
if(check_uri(context, ext_img_uri))
{
uri = Uri.parse(ext_img_uri);
}else if(check_uri(context, int_img_uri))
{
uri = Uri.parse(int_img_uri);
}else {
idPath.put("id", "");
idPath.put("path", "");
return idPath;
}
String[] proj = { Media.DATA, Media._ID };
Cursor cursor = context.getContentResolver().query(uri, proj, null, null, null);
int column_index = cursor.getColumnIndexOrThrow(Media.DATA);
cursor.moveToFirst();
String filepath = cursor.getString(column_index);
idPath.put("id", id.toString());
idPath.put("path", filepath);
return idPath;
}
public static boolean check_uri(Context context, String uri)
{
try{
ContentResolver cr = context.getContentResolver();
String[] projection = {MediaStore.MediaColumns.DATA};
Cursor cur = cr.query(Uri.parse(uri), projection, null, null, null);
if(cur != null)
{
cur.moveToFirst();
String filePath = cur.getString(0);
if(! new File(filePath).exists()){
return false;
}
} else {
return false;
}
} catch (Exception e)
{
return false;
}
return true;
}
用法映射idPath=ImageIdPathFetcher.getRealIdPathFromID(getApplicationContext(),Integer.valueOf(image_id));
公共静态映射getRealIdPathFromID(上下文上下文,整数id){
Map idPath=new HashMap();
uriexternal_images_Uri=MediaStore.images.Media.getContentUri(“外部”);
Uri internal_images_Uri=MediaStore.images.Media.getContentUri(“内部”);
//初始化uri
uriuri=外部图像Uri;
字符串ext\u img\u uri=external\u images\u uri.toString()+“/”+id;
字符串int\u img\u uri=内部图像\u uri.toString()+“/”+id;
if(检查uri(上下文,ext\img\u uri))
{
uri=uri.parse(ext\u img\u uri);
}else if(检查uri(上下文,int\img\u uri))
{
uri=uri.parse(int\u img\u uri);
}否则{
id路径put(“id”,”);
放置(“路径”,“路径”);
返回idPath;
}
字符串[]项目={Media.DATA,Media.\u ID};
Cursor Cursor=context.getContentResolver().query(uri、proj、null、null、null);
int column_index=cursor.getColumnIndexOrThrow(Media.DATA);
cursor.moveToFirst();
stringfilepath=cursor.getString(列索引);
put(“id”,id.toString());
put(“path”,filepath);
返回idPath;
}
公共静态布尔检查uri(上下文上下文,字符串uri)
{
试一试{
ContentResolver cr=context.getContentResolver();
字符串[]投影={MediaStore.MediaColumns.DATA};
cursorcur=cr.query(Uri.parse(Uri)、projection、null、null、null);
如果(cur!=null)
{
cur.moveToFirst();
String filePath=cur.getString(0);
如果(!新文件(filePath).exists()){
返回false;
}
}否则{
返回false;
}
}捕获(例外e)
{
返回false;
}
返回true;
}
这就是我使用的
public static Uri getImageContentUri(Context context, File imageFile) {
String filePath = imageFile.getAbsolutePath();
Cursor cursor = context.getContentResolver().query(
MediaStore.Images.Media.EXTERNAL_CONTENT_URI,
new String[]{MediaStore.Images.Media._ID},
MediaStore.Images.Media.DATA + "=? ",
new String[]{filePath}, null);
if (cursor != null) {
try {
if (cursor.moveToFirst()) {
int id = cursor.getInt(cursor.getColumnIndex(MediaStore.MediaColumns._ID));
return Uri.withAppendedPath(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, String.valueOf(id));
}
} finally {
cursor.close();
}
}
cursor = context.getContentResolver().query(
MediaStore.Images.Media.INTERNAL_CONTENT_URI,
new String[]{MediaStore.Images.Media._ID},
MediaStore.Images.Media.DATA + "=? ",
new String[]{filePath}, null);
if (cursor != null) {
try {
if (cursor.moveToFirst()) {
int id = cursor.getInt(cursor.getColumnIndex(MediaStore.MediaColumns._ID));
return Uri.withAppendedPath(MediaStore.Images.Media.INTERNAL_CONTENT_URI, String.valueOf(id));
}
} finally {
cursor.close();
}
}
return null;
}
还可以使用以下工具查询内部和外部数据库:
我不是专家。但是我想建议您查询感兴趣的图像,不要在check_uri(…)中迭代图像。例如:getContentResolver().query(MediaStore.Images.Media.EXTERNAL_CONTENT_URI,列,MediaStore.Images.Media._ID+“>”+ID,null,MediaStore.Images.Media._ID);
String myIdImgStr = "123"; // the unique ID of the image in the MediaStore
ContentResolver contentResolver = this.getContext().getContentResolver();
String [] proj = { MediaStore.Images.Media.DATA, MediaStore.Images.Media._ID };
MergeCursor cursor = new MergeCursor(new Cursor[] {
MediaStore.Images.Media.query(contentResolver,
Uri.parse(MediaStore.Images.Media.INTERNAL_CONTENT_URI + "/" + myIdImgStr),
proj),
MediaStore.Images.Media.query(contentResolver,
Uri.parse(MediaStore.Images.Media.EXTERNAL_CONTENT_URI + "/" + myIdImgStr),
proj)
});
if(cursor.getCount() == 1) {
cursor.moveToFirst();
String filepath = cursor.getString(cursor.getColumnIndex(MediaStore.Images.Media.DATA));
}