Android中的Android选择图片不起作用(Android 6.0& Android 5.1.1)

时间:2016-06-03 12:48:15

标签: android image action gallery photo-gallery

我正在使用以下代码从设备库中选择一个图像文件:

首先我称这段代码为:

Intent i = new Intent();
i.setType("image/*");
i.setAction(Intent.ACTION_GET_CONTENT);
startActivityForResult(Intent.createChooser(i, "Select Picture"), RESULT_LOAD_IMAGE);

这是我的onActivityResult方法:

@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) {

            photoPath  = getPath(data.getData());
            ByteArrayOutputStream baos = new ByteArrayOutputStream();
            FileInputStream fis;
            try {
                fis = new FileInputStream(new File(photoPath));
                byte[] buf = new byte[1024];
                int n;
                while (-1 != (n = fis.read(buf))) {
                    baos.write(buf, 0, n);
                }

                img.setImageBitmap(BitmapFactory.decodeFile(photoPath));

            } catch (Exception e) {
                e.printStackTrace();
            }

        }
    }

这是一个检索图像路径的辅助方法:

private String getPath(Uri uri) {

        String[]  data = { MediaStore.Images.Media.DATA };
        CursorLoader loader = new CursorLoader(getApplicationContext(), uri, data, null, null, null);
        Cursor cursor = loader.loadInBackground();
        int column_index = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
        cursor.moveToFirst();
        return cursor.getString(column_index);
    }

我的问题是该应用程序很奇怪。在我的6.0模拟器中,有时它可以工作,有时也可以。在其他设备(Android 5.1.1)中,FileNotFound Exception被抛出此行

fis = new FileInputStream(new File(photoPath));

所有必需的权限都很好。你们有什么想法在这里发生了什么?或者你有什么更好的建议用什么来从画廊中挑选图像?

4 个答案:

答案 0 :(得分:4)

试试这个你可以直接从onActivityResult

设置图片
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);

        if (requestCode == PICK_IMAGE_REQUEST && resultCode == RESULT_OK && data != null && data.getData() != null) {
try{
            final Uri imageUri = data.getData();
            final InputStream imageStream = getContentResolver().openInputStream(imageUri);
            final Bitmap selectedImage = BitmapFactory.decodeStream(imageStream);

            imageView.setImageBitmap(selectedImage);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

答案 1 :(得分:1)

步骤1:删除<link href="http://cdnjs.cloudflare.com/ajax/libs/font-awesome/4.4.0/css/font-awesome.min.css" rel="stylesheet" /> <nav> <ul> <li class="left"><a class="fa fa-home" href="index.jsp">&nbsp;Home</a> </li> <li class="left"><a class="fa fa-shopping-cart" href="#home">&nbsp;Carrello</a> </li> <li id="search"> <div id="form-wrapper"> <button class="go-button fa fa-search"></button> <span class="nav-list"> <span class="current-selection"> </span> <select id="dropdown"> <option value="books-and-ebooks">Books & eBooks</option> <option value="audiobooks">Audiobooks</option> <option value="dvds">DVDs</option> <option value="other-resources">Other Resources</option> <option value="random">Random</option> </select> </span> <div class="in-wrap"> <input type="text" name="query" id="search-box"> </div> </div> </li> <li class="right"><a class="fa fa-user-plus" href="">&nbsp;Signup</a> </li> <li id="login" class="right"> <a class="fa fa-sign-in" href="">&nbsp;Login</a> <form id="login_form" action="login" method="post"> <input id="login_username" class="login_field" name="username" type="text" placeholder="username" /> <br /> <input id="login_password" class="login_field" name="password" type="password" placeholder="password" /> <br /> <div id="submit-div"> <input type="submit" value="login" /> </div> </form> </li> </ul> </nav>,因为您没有使用它。

第2步:删除ByteArrayOutputStreamphotoPath = getPath(data.getData());方法,因为它们是错误的。

步骤3:使用an image loading library异步填充getPath(),并将图片的ImageViewUri)传递给您。或者,滚动大量自己的图片加载代码,包括分支后台主题并使用data.getData()获取getContentResolver().openInputStream()标识的内容{。}}。

答案 2 :(得分:0)

您可以使用如下代码

public void pickImage() {
  Intent intent = new Intent(Intent.ACTION_GET_CONTENT);
  intent.setType("image/*");
  startActivityForResult(intent, PICK_PHOTO_FOR_AVATAR);
}

@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    if (requestCode == PICK_PHOTO_FOR_AVATAR && resultCode == Activity.RESULT_OK) {
        if (data == null) {
            //Display an error
            return;
        }
        InputStream inputStream = context.getContentResolver().openInputStream(data.getData());
        //Now you can do whatever you want with your inpustream, save it as file, upload to a server, decode a bitmap...
    }
}

答案 3 :(得分:-1)

//你在片段所以使用下面的代码希望它的工作 final Uri imageUri = data.getData();

            final InputStream imageStream =getActivity().getContentResolver().openInputStream(imageUri);

            final Bitmap selectedImage = BitmapFactory.decodeStream(imageStream);