无法使用片段的画廊获取图像 [英] Can't get the image from gallery using Fragment

查看:152
本文介绍了无法使用片段的画廊获取图像的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我想从画廊的形象和取代的ImageView的最初形象。但是,即使选择在画廊的形象不会改变。

我检查它是否工作正常,直到使用断点的地方。的的onActivityResult在try-catch以下code部分似乎原因。

 中的InputStream = getActivity()getContentResolver()openInputStream(data.getData())。;

什么是图像的原因并没有改变?

 公共类片段1片段扩展{    私有静态最终诠释REQUEST_GALLERY = 0;
    私人诠释viewWidth,viewHeight;
    私人ImageView的ImageView的;    @覆盖
    公共查看onCreateView(LayoutInflater充气器,容器的ViewGroup,捆绑savedInstanceBundle){        最后查看视图= inflater.inflate(R.layout.fragment_person_create,集装箱,FALSE);
        BMP位图= BitmapFactory.de codeResource(getResources(),R.drawable.image);
        ImageView的=(ImageView的)view.findViewById(R.id.image_id);
        imageView.setImageBitmap(BMP);
        imageView.setOnClickListener(新OnClickListener(){
            @覆盖
            公共无效的onClick(视图v){
                //要图库
                意向意图=新的Intent();
                intent.setType(图像/ *);
                intent.setAction(Intent.ACTION_GET_CONTENT);
                startActivityForResult(意向,REQUEST_GALLERY);
            }
        });
        按钮BTN =(按钮)view.findViewById(R.id.bt_saveperson);
        btn.setOnClickListener(新OnClickListener(){
            @覆盖
            公共无效的onClick(视图v){
                的EditText名=(EditText上)view.findViewById(R.id.et_name);
                /* 保存数据 */
            }
        }
        返回视图。
    }    @覆盖
    公共无效的onActivityResult(INT申请code,INT结果code,意图数据){
        如果(要求code == REQUEST_GALLERY&放大器;&安培;结果code == Activity.RESULT_OK){
            尝试{
                InputStream的在= getActivity()getContentResolver()openInputStream(data.getData())。。
                位图位图= BitmapFactory.de codeStream(中);
                附寄();
                imageView.setImageBitmap(位图);
            }赶上(例外五){
            }
        }
    }
}

更新

 公共字符串getAbsolutePath(URI URI){
        Log.v(标签,666);
        如果(Build.VERSION.SDK_INT> = 19){
            Log.v(标签,777);
            串ID = uri.getLastPathSegment()分割(:)。[1];
            Log.v(标签,888);
            最终的String [] = imageColumns {MediaStore.Images.Media.DATA};
            最后弦乐imageOrderBy = NULL;
            乌里tempUri = getUri();
            。光标imageCursor = getActivity()getContentResolver()查询(tempUri,imageColumns,MediaStore.Images.Media._ID +=+ ID,空,imageOrderBy);
            如果(imageCursor.moveToFirst()){
                返回imageCursor.getString(imageCursor.getColumnIndex(MediaStore.Images.Media.DATA));
            }其他{
                返回null;
            }
        }其他{
            的String [] =投影{MediaColumns.DATA};
            光标光标= getActivity()getContentResolver()查询(URI,投影,NULL,NULL,NULL);
            如果(指针!= NULL){
                INT与Column_Index = cursor.getColumnIndexOrThrow(MediaColumns.DATA);
                cursor.moveToFirst();
                返回cursor.getString(Column_Index中);
            }其他
                返回null;
            }
        }
    }
    私人乌里getUri(){
        字符串状态= Environment.getExternalStorageState();
        如果(!state.equalsIgnoreCase(Environment.MEDIA_MOUNTED))
            返回MediaStore.Images.Media.INTERNAL_CONTENT_URI;        返回MediaStore.Images.Media.EXTERNAL_CONTENT_URI;
    }

LogCat中

  5月11日至20日:41:20.295:V /标签(1647年):666
5月11日至20日:41:20.295:V /标签(1647年):777
5月11日至20日:41:20.325:W / EGL_emulation(1647年):eglSurfaceAttrib没有实现
5月11日至20日:41:20.575:W / MediaFocusControl(1272):RemoteControlClient死亡
5月11日至20日:41:20.575:I / ActivityManager(1272):杀1498:com.android.music / u0a32(形容词15):空#17
5月11日至20日:41:20.935:I / ActivityManager(1272):杀1437:com.android.printspooler / u0a39(形容词15):空#17
5月11日至20日:41:20.975:D /(935):HostConnection:GET()新主机连接建立0xb7e00a40,TID 1896年


解决方案

使用自定义函数获取Get图像bitamp的绝对路径:

  @覆盖
公共无效的onActivityResult(INT申请code,INT结果code,意图数据){
   如果(要求code == REQUEST_GALLERY&放大器;&安培;结果code == Activity.RESULT_OK){
      尝试{
          imageView.setImageBitmap(BitmapFactory.de codeFILE(getAbsolutePath(data.getData())));
      }赶上(例外五){
      }
    }
} 公共字符串getAbsolutePath(URI URI){
    如果(Build.VERSION.SDK_INT> = 19){
        字符串ID =;
        如果(uri.getLastPathSegment()拆分(:)长度大于0){
            。ID = uri.getLastPathSegment()分割(:)[1];
        }其他{
            。ID = uri.getLastPathSegment()分割(:)[0];
        }
        最终的String [] = imageColumns {MediaStore.Images.Media.DATA};
        最后弦乐imageOrderBy = NULL;
        乌里tempUri = getUri();
        光标imageCursor = getContentResolver()查询(tempUri,imageColumns,MediaStore.Images.Media._ID +=+ ID,空,imageOrderBy)。
        如果(imageCursor.moveToFirst()){
            返回imageCursor.getString(imageCursor.getColumnIndex(MediaStore.Images.Media.DATA));
        }其他{
            返回null;
        }
    }其他{
        的String [] =投影{MediaColumns.DATA};
        光标光标= getContentResolver()查询(URI,投影,NULL,NULL,NULL);
        如果(指针!= NULL){
            INT与Column_Index = cursor.getColumnIndexOrThrow(MediaColumns.DATA);
            cursor.moveToFirst();
            返回cursor.getString(Column_Index中);
        }其他
            返回null;
    }
}

I want to get the image from the gallery and replace the initial image of the 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.

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

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 :

@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;
    }
}

这篇关于无法使用片段的画廊获取图像的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆