Gallery返回不同Android版本的Intent.ACTION\u GET\u内容的媒体文件的不同URI
下面是一段代码,用于调用intent以打开图像库Gallery返回不同Android版本的Intent.ACTION\u GET\u内容的媒体文件的不同URI,android,android-intent,Android,Android Intent,下面是一段代码,用于调用intent以打开图像库 public void getImage() { Intent i = new Intent(); i.setType("image/*"); i.setAction(Intent.ACTION_GET_CONTENT); i.addCategory(Intent.CATEGORY_OPENABLE); //Intent customChooserIntent = I
public void getImage() {
Intent i = new Intent();
i.setType("image/*");
i.setAction(Intent.ACTION_GET_CONTENT);
i.addCategory(Intent.CATEGORY_OPENABLE);
//Intent customChooserIntent = Intent.createChooser(i, "Pick an image");
startActivityForResult(i, 10);
}
Intent i = new Intent(
Intent.ACTION_PICK,
android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
startActivityForResult(i, RESULT_LOAD_IMAGE);
收到对活动结果的响应
public void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (resultCode == Activity.RESULT_OK) {
if (requestCode == 10) {
Uri selectedImageUri = data.getData();
String selectedImagePath = getRealPathFromURI(selectedImageUri);
}
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == RESULT_LOAD_IMAGE && resultCode == RESULT_OK
&& null != data) {
Uri selectedImage = data.getData();
String[] filePathColumn = { MediaStore.Images.Media.DATA };
Cursor cursor = getContentResolver().query(selectedImage,
filePathColumn, null, null, null);
cursor.moveToFirst();
int columnIndex = cursor.getColumnIndex(filePathColumn[0]);
String picturePath = cursor.getString(columnIndex);
cursor.close();
bmImage = BitmapFactory.decodeFile(picturePath);
// setting bitmap to imageview
// coImage.setImageBitmap(bmImage);
strEncodeImg = encodeTobase64(bmImage);
Log.e("Image set successfully...!", "yes......................");
coImage.setImageBitmap(decodeBase64(strEncodeImg));
}
}
getRealPathfromURI()的代码
我得到了一个简单的答案,就是在android SDK版本的基础上加密路径
public String getRealPathFromURI(Uri uri) {
if (Build.VERSION.SDK_INT < 19) {
String[] projection = {MediaStore.Images.Media.DATA};
@SuppressWarnings("deprecation")
Cursor cursor = getActivity().managedQuery(uri, projection, null, null, null);
int column_index = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
cursor.moveToFirst();
return cursor.getString(column_index);
} else {
String selectedImagePath = null;
String wholeID = DocumentsContract.getDocumentId(uri);
// Split at colon, use second item in the array
String id = wholeID.split(":")[1];
String[] column = {MediaStore.Images.Media.DATA};
// where id is equal to
String sel = MediaStore.Images.Media._ID + "=?";
Cursor cursor = getActivity().getContentResolver().query(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, column, sel, new String[]{id}, null);
int columnIndex = cursor.getColumnIndex(column[0]);
if (cursor.moveToFirst()) {
selectedImagePath = cursor.getString(columnIndex);
}
cursor.close();
return selectedImagePath;
}
}
公共字符串getRealPathFromURI(Uri){
如果(Build.VERSION.SDK_INT<19){
字符串[]投影={MediaStore.Images.Media.DATA};
@抑制警告(“弃用”)
Cursor Cursor=getActivity().managedQuery(uri、投影、null、null、null);
int column_index=cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
cursor.moveToFirst();
返回cursor.getString(列索引);
}否则{
字符串selectedImagePath=null;
字符串wholeID=DocumentsContract.getDocumentId(uri);
//在冒号处拆分,使用数组中的第二项
字符串id=wholeID.split(“:”[1];
String[]column={MediaStore.Images.Media.DATA};
//其中id等于
字符串sel=MediaStore.Images.Media._ID+“=?”;
Cursor Cursor=getActivity().getContentResolver().query(MediaStore.Images.Media.EXTERNAL_CONTENT_URI,column,sel,新字符串[]{id},null);
int columnIndex=cursor.getColumnIndex(列[0]);
if(cursor.moveToFirst()){
选择edimagepath=cursor.getString(columnIndex);
}
cursor.close();
返回selectedImagePath;
}
}
以下是一段代码,用于调用intent以打开图像库
public void getImage() {
Intent i = new Intent();
i.setType("image/*");
i.setAction(Intent.ACTION_GET_CONTENT);
i.addCategory(Intent.CATEGORY_OPENABLE);
//Intent customChooserIntent = Intent.createChooser(i, "Pick an image");
startActivityForResult(i, 10);
}
Intent i = new Intent(
Intent.ACTION_PICK,
android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
startActivityForResult(i, RESULT_LOAD_IMAGE);
收到对活动结果的响应
public void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (resultCode == Activity.RESULT_OK) {
if (requestCode == 10) {
Uri selectedImageUri = data.getData();
String selectedImagePath = getRealPathFromURI(selectedImageUri);
}
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == RESULT_LOAD_IMAGE && resultCode == RESULT_OK
&& null != data) {
Uri selectedImage = data.getData();
String[] filePathColumn = { MediaStore.Images.Media.DATA };
Cursor cursor = getContentResolver().query(selectedImage,
filePathColumn, null, null, null);
cursor.moveToFirst();
int columnIndex = cursor.getColumnIndex(filePathColumn[0]);
String picturePath = cursor.getString(columnIndex);
cursor.close();
bmImage = BitmapFactory.decodeFile(picturePath);
// setting bitmap to imageview
// coImage.setImageBitmap(bmImage);
strEncodeImg = encodeTobase64(bmImage);
Log.e("Image set successfully...!", "yes......................");
coImage.setImageBitmap(decodeBase64(strEncodeImg));
}
}
您可以将此图像以字符串格式保存在数据库中,也可以使用此字符串执行任何操作—无需将图像存储在文件夹中—它只是位图代码。
非常简单。这是一个非常简单的代码(已测试) 图片:
if (Build.VERSION.SDK_INT <= 19) {
Intent i = new Intent();
i.setType("image/*");
i.setAction(Intent.ACTION_GET_CONTENT);
i.addCategory(Intent.CATEGORY_OPENABLE);
startActivityForResult(i, 10);
} else if (Build.VERSION.SDK_INT > 19) {
Intent intent = new Intent(Intent.ACTION_PICK, android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
startActivityForResult(intent, 10);
}
尝试删除
getRealPathFromURI()
,因为它无法可靠地工作。它可能不代表您可以在文件系统上访问的任何内容。使用ContentResolver
上的方法,例如openInputStream()
,使用Uri
@Stella看看我的答案,它比这个解决方案简单得多。