简体   繁体   English

无法使用Fragment从图库中获取图像

[英]Can't get the image from gallery using Fragment

I want to get the image from the gallery and replace the initial image of the imageView. 我想从图库中获取图像并替换imageView的初始图像。 But it does not change even if select the image in the gallery. 但是即使选择图库中的图像也不会改变。

I examined if it works normally until somewhere using the breakpoint. 我检查了该功能是否正常,直到使用断点的某个地方为止。 The following code portion of the try-catch of onActivityResult seems the cause. onActivityResult的try-catch的以下代码部分似乎是原因。

InputStream in = getActivity().getContentResolver().openInputStream(data.getData());

What is the cause of the image does not change? 图像不变化是什么原因?

public class Fragment1 extends Fragment {

    private static final int REQUEST_GALLERY = 0;
    private int viewWidth, viewHeight;
    private ImageView imageView;

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceBundle){

        final View view = inflater.inflate(R.layout.fragment_person_create, container, false);
        Bitmap bmp = BitmapFactory.decodeResource(getResources(), R.drawable.image);
        imageView = (ImageView) view.findViewById(R.id.image_id);
        imageView.setImageBitmap(bmp);
        imageView.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View v) {
                // To Gallery
                Intent intent = new Intent();
                intent.setType("image/*");
                intent.setAction(Intent.ACTION_GET_CONTENT);
                startActivityForResult(intent, REQUEST_GALLERY);
            }
        });
        Button btn = (Button)view.findViewById(R.id.bt_saveperson);
        btn.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View v) {
                EditText name = (EditText)view.findViewById(R.id.et_name);
                /* save data */
            }
        }
        return view;
    }

    @Override
    public void onActivityResult(int requestCode, int resultCode, Intent data) {
        if(requestCode == REQUEST_GALLERY && resultCode == Activity.RESULT_OK) {
            try {
                InputStream in = getActivity().getContentResolver().openInputStream(data.getData());
                Bitmap bitmap = BitmapFactory.decodeStream(in);
                in.close();
                imageView.setImageBitmap(bitmap);
            } catch (Exception e) {
            }
        } 
    }
}

Update 更新资料

    public String getAbsolutePath(Uri uri) {
        Log.v("tag", "666");
        if(Build.VERSION.SDK_INT >= 19){
            Log.v("tag", "777");
            String id = uri.getLastPathSegment().split(":")[1];
            Log.v("tag", "888");
            final String[] imageColumns = {MediaStore.Images.Media.DATA };
            final String imageOrderBy = null;
            Uri tempUri = getUri();
            Cursor imageCursor = getActivity().getContentResolver().query(tempUri, imageColumns,MediaStore.Images.Media._ID + "="+id, null, imageOrderBy);
            if (imageCursor.moveToFirst()) {
                return imageCursor.getString(imageCursor.getColumnIndex(MediaStore.Images.Media.DATA));
            }else{
                return null;
            }
        }else{
            String[] projection = { MediaColumns.DATA };
            Cursor cursor = getActivity().getContentResolver().query(uri, projection, null, null, null);
            if (cursor != null) {
                int column_index = cursor.getColumnIndexOrThrow(MediaColumns.DATA);
                cursor.moveToFirst();
                return cursor.getString(column_index);
            } else
                return null;
            }
        }
    }
    private Uri getUri() {
        String state = Environment.getExternalStorageState();
        if(!state.equalsIgnoreCase(Environment.MEDIA_MOUNTED))
            return MediaStore.Images.Media.INTERNAL_CONTENT_URI;

        return MediaStore.Images.Media.EXTERNAL_CONTENT_URI;
    }

LogCat LogCat

11-20 05:41:20.295: V/tag(1647)              : 666
11-20 05:41:20.295: V/tag(1647)              : 777
11-20 05:41:20.325: W/EGL_emulation(1647)    : eglSurfaceAttrib not implemented
11-20 05:41:20.575: W/MediaFocusControl(1272):   RemoteControlClient died
11-20 05:41:20.575: I/ActivityManager(1272)  : Killing 1498:com.android.music/u0a32 (adj 15): empty #17
11-20 05:41:20.935: I/ActivityManager(1272)  : Killing 1437:com.android.printspooler/u0a39 (adj 15): empty #17
11-20 05:41:20.975: D/(935): HostConnection: :get() New Host Connection established 0xb7e00a40, tid 1896

Use custom function get Absolute path of get image bitamp : 使用自定义函数get获取图像bitamp的绝对路径:

@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
   if(requestCode == REQUEST_GALLERY && resultCode == Activity.RESULT_OK) {
      try {
          imageView.setImageBitmap(BitmapFactory.decodeFile(getAbsolutePath(data.getData())));
      } catch (Exception e) {
      }
    } 
}

 public String getAbsolutePath(Uri uri) {
    if(Build.VERSION.SDK_INT >= 19){
        String id="";
        if(uri.getLastPathSegment().split(":").length>0){
            id = uri.getLastPathSegment().split(":")[1];
        }else{
            id = uri.getLastPathSegment().split(":")[0];
        }
        final String[] imageColumns = {MediaStore.Images.Media.DATA };
        final String imageOrderBy = null;
        Uri tempUri = getUri();
        Cursor imageCursor = getContentResolver().query(tempUri, imageColumns,MediaStore.Images.Media._ID + "="+id, null, imageOrderBy);
        if (imageCursor.moveToFirst()) {
            return imageCursor.getString(imageCursor.getColumnIndex(MediaStore.Images.Media.DATA));
        }else{
            return null;
        }
    }else{
        String[] projection = { MediaColumns.DATA };
        Cursor cursor = getContentResolver().query(uri, projection, null, null, null);
        if (cursor != null) {
            int column_index = cursor.getColumnIndexOrThrow(MediaColumns.DATA);
            cursor.moveToFirst();
            return cursor.getString(column_index);
        } else
            return null;
    }
}
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
    if (requestCode == CODE_GALLERY_REQUEST){
        if (grantResults.length >0 && grantResults[0]== PackageManager.PERMISSION_GRANTED){
            Intent intent = new Intent(Intent.ACTION_PICK);
            intent.setType("image/*");
            startActivityForResult(Intent.createChooser(intent,"Select deposit slip"), CODE_GALLERY_REQUEST);

        }else{
            Toast.makeText(getActivity(),"You dont Have permission",Toast.LENGTH_LONG).show();
        }
        return;
    }

    super.onRequestPermissionsResult(requestCode, permissions, grantResults);
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM