图库图像捕获不会返回数据 - 在某些设备上
private void selectImage() {
final CharSequence[] options = { "Take Photo", "Choose from Gallery","Cancel" };
AlertDialog.Builder builder = new AlertDialog.Builder(ConformComplain.this);
builder.setTitle("Add Photo!");
builder.setItems(options, new DialogInterface.OnClickListener() {
@RequiresApi(api = Build.VERSION_CODES.JELLY_BEAN_MR2)
@Override
public void onClick(DialogInterface dialog, int item) {
if(!marshMallowPermission.checkPermissionForCamera()){
marshMallowPermission.requestPermissionForCamera();
}else {
if (!marshMallowPermission.checkPermissionForExternalStorage()){
marshMallowPermission.requestPermissionForExternalStorage();
}
else if (options[item].equals("Take Photo"))
{
Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
File f = new File(Environment.getExternalStorageDirectory(), "temp.jpg");
intent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(f));
startActivityForResult(intent, 1);
}
else if (options[item].equals("Choose from Gallery"))
{
Intent intent = new Intent();
intent.setType("image/*");
intent.putExtra(Intent.EXTRA_ALLOW_MULTIPLE, true);
intent.setAction(Intent.ACTION_GET_CONTENT);
startActivityForResult(Intent.createChooser(intent, "android.intent.action.SEND_MULTIPLE"), 2);
}
else if (options[item].equals("Cancel")) {
dialog.dismiss();
}
}
}
});
builder.show();
}
和
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == 2) {
if(data.getData()!=null){
Uri mImageUri=data.getData();
String imagePath = GetPathToImage(context, mImageUri);
Log.v("LOG_TAG", "hguyhuu "+ imagePath);
bitmap = (BitmapFactory.decodeFile(imagePath));
linearLayout.setVisibility(View.VISIBLE);
relativeLayout.setVisibility(View.GONE);
viewImage.setImageBitmap(bitmap);
}else{
if(data.getClipData()!=null){
ClipData mClipData=data.getClipData();
mArrayUri=new ArrayList<String>();
gridAdapter = new GridViewAdapter(this, R.layout.grid_single,mArrayUri);
gridView.setAdapter(gridAdapter);
for(int i=0;i<mClipData.getItemCount();i++){
ClipData.Item item = mClipData.getItemAt(i);
Uri uri = item.getUri();
Log.e(TAG, "onActivityResult: jnj"+uri );
String path = GetPathToImage(context,uri);
Log.e(TAG, "onActivityResult: "+path );
mArrayUri.add(path);
}
linearLayout.setVisibility(View.GONE);
relativeLayout.setVisibility(View.VISIBLE);
}
}
}
}
public String GetPathToImage(Context context, Uri uri) {
Cursor cursor = null;
try {
String[] proj = { MediaStore.Images.Media.DATA };
cursor = context.getContentResolver().query(uri, proj, null, null, null);
Log.e(TAG, "GetPathToImage: "+cursor );
assert cursor != null;
int column_index = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
cursor.moveToFirst();
return cursor.getString(column_index);
} finally {
if (cursor != null) {
cursor.close();
}
}
}
答案 0 :(得分:0)
你在这里的大部分内容都是错误的。
就ACTION_IMAGE_CAPTURE
:
Uri.fromFile()
提高到24或更高,targetSdkVersion
将无法在Android 7.0+上运行,因为您将抛出FileUriExposedException
onActivityResult()
就ACTION_GET_CONTENT
而言,GetPathToImage()
完全错误。最好的情况是,如果您从Uri
获得MediaStore
,它将会起作用,即使这样,生成的“路径”也可能无法使用。 Use the Uri
properly