从Android中的图像获取uri [英] Get uri from image in Android

查看:189
本文介绍了从Android中的图像获取uri的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在尝试从图像获取路径,以便稍后将其发送到服务器.问题是当我尝试获取它时,我的代码不起作用(您会看到一个额外的}.这是因为OnCreate中的代码结束了,然后我编写了其他函数):

I am trying to get the Path from an image to send it later to a server. The problem is when I try to get it, my code doesn't work (you will see there is an extra }. That is because the code from the OnCreate ends and then I worte the other functions):

enviar.setOnClickListener(new View.OnClickListener() {
            String datos="";
            //Bundle extras=getIntent().getExtras();
            @Override
            public void onClick(View view) {
                Intent intent = new Intent(Intent.ACTION_GET_CONTENT);
                intent.setType("image/*");
                startActivityForResult(intent, 0);
                //Uri imagen=intent.getData();
                //datos=imagen.getPath();
                //mostrar.setText(datos);
            }
        });
    }

    private String getRealPathFromURI(Uri contentURI) {
        String result;
        Cursor cursor = getContentResolver().query(contentURI, null, null, null, null);
        if (cursor == null) {
            result = contentURI.getPath();
        } else {
            cursor.moveToFirst();
            int idx = cursor.getColumnIndex(MediaStore.Images.ImageColumns.DATA);
            result = cursor.getString(idx);
            cursor.close();
        }
        return result;
    }
    @Override
    public void onActivityResult(int requestCode, int resultCode, Intent imageReturnedIntent) {
        super.onActivityResult(requestCode, resultCode, imageReturnedIntent);

        switch(requestCode) {
            case 0:
                if(resultCode == this.RESULT_OK){
                    try {
                        final Uri imageUri = imageReturnedIntent.getData();
                        String path = getRealPathFromURI(imageUri);
                        mostrar.setText(path);
                    }
                    catch (Exception e) {
                        Log.e("Erroreeeee: ", e.getMessage());
                    }
                }
                break;
        }
    }

推荐答案

您有两个问题.

第一个是startActivityForResult()不是立即的.在下一条语句中没有任何结果.

The first one is that startActivityForResult() is not immediate. You do not have any results in the next statement.

因此,欢迎您致电startActivityForResult(),就像我在

So, you are welcome to call startActivityForResult(), as I do in this sample app:

private void get() {
    Intent i=
      new Intent()
        .setType("image/png")
        .setAction(Intent.ACTION_GET_CONTENT)
        .addCategory(Intent.CATEGORY_OPENABLE);

    startActivityForResult(i, REQUEST_GET);
}

您的结果将发送到onActivityResult():

  @Override
  public void onActivityResult(int requestCode, int resultCode,
                               Intent resultData) {
    if (resultCode==Activity.RESULT_OK) {
      Uri image=resultData.getData();
      // do something
    }
  }

您的第二个问题是您认为自己正在选择文件.你不是.您正在使用用户决定具有句柄ACTION_GET_CONTENT的任何活动来选择内容.仅当Uri的方案为file时,getPath()才有意义,而这不太可能.没有可靠的方法来获取任意Uri的文件系统路径,原因很简单,因为Uri不必指向文件.

Your second problem is that you are thinking that you are picking a file. You are not. You are picking a piece of content, using any activity that the user decides to have handle ACTION_GET_CONTENT. getPath() only has meaning if the scheme of the Uri is file, and that is rather unlikely. There is no reliable means of getting a filesystem path for an arbitrary Uri, for the simple reason that the Uri does not have to point to a file.

理想情况下,您的上传到服务器"逻辑可以与InputStream一起使用.在这种情况下,请在ContentResolver上调用openInputStream()以获取由Uri标识的内容上的InputStream.如果您的上传到服务器"逻辑仅适用于文件,请使用InputStream将该内容复制到您控制的某个临时文件中(例如,在getCacheDir()中),然后使用该临时文件进行上传.完成后,删除该临时文件.

Ideally, your "upload to a server" logic can work with an InputStream. In that case, call openInputStream() on a ContentResolver to get an InputStream on the content identified by the Uri. If your "upload to a server" logic only works with files, use that InputStream to copy the content to some temporary file that you control (e.g., in getCacheDir()), then use that temporary file for your upload. Delete the temporary file when you are done with it.

这篇关于从Android中的图像获取uri的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

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