Выбор изображения из галереи не работает в Android

Я пытаюсь выбрать изображение из галереи для отображения в представлении изображений, выбор работает, но изображение не отображается в представлении изображений, оно остается пустым.

Код:

public class MainActivity extends AppCompatActivity {

    private static final int SELECTED_PICTURE=1;
    ImageView iv;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);

        iv=(ImageView)findViewById(R.id.imageView1);

        //FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab);
        //fab.setOnClickListener(new View.OnClickListener() {
            //@Override
            //public void onClick(View view) {
                //Snackbar.make(view, "Replace with your own action", Snackbar.LENGTH_LONG)
                        //.setAction("Action", null).show();
            //}
        }//);
    public void btnClick(View v){
        Intent i=new Intent(Intent.ACTION_PICK,android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
        startActivityForResult(i, SELECTED_PICTURE);
    }
    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);

        switch (requestCode) {
            case SELECTED_PICTURE:
                if(resultCode==RESULT_OK){
                    Uri uri=data.getData();
                    String[]projection={MediaStore.Images.Media.DATA};

                    Cursor cursor=getContentResolver().query(uri, projection, null, null, null);
                    cursor.moveToFirst();

                    int columnIndex=cursor.getColumnIndex(projection[0]);
                    String filePath=cursor.getString(columnIndex);
                    cursor.close();

                    Bitmap yourSelectedImage=BitmapFactory.decodeFile(filePath);
                    Drawable d=new BitmapDrawable(yourSelectedImage);

                    iv.setBackground(d);

                }
                break;

            default:
                break;
        }
    }
}

Что я делаю не так?


person GTLUKEGT    schedule 11.10.2017    source источник
comment
как насчет imageView.setImageBitmap(bitmap) метода   -  person Xenolion    schedule 11.10.2017
comment
попробуйте iv.setImageDrawable(d); вместо iv.setBackground(d);   -  person UltimateDevil    schedule 11.10.2017
comment
github.com/esafirm/android-image-picker попробуйте эту библиотеку, она обрабатывает все беспорядок, связанный с выбором изображения или фотографированием, т. е. разрешения, проблемы с ориентацией и т. д.   -  person Adeel Turk    schedule 11.10.2017


Ответы (4)


Попробуйте код ниже;

iv.setImageBitmap(yourSelectedImage);

вместо кода ниже;

 Drawable d=new BitmapDrawable(yourSelectedImage);
 iv.setBackground(d);
person Vishal Vaishnav    schedule 11.10.2017

Проверьте этот пример, я просто попробовал, и он работает!

http://codetheory.in/android-pick-select-image-from-gallery-with-intents/

Надеюсь помог, удачи

person Fahd Al-Qahtani    schedule 11.10.2017

Когда-то у меня была такая же проблема, и это было вызвано тем, что иногда путь к файлу, возвращаемый Uri из data.getData(), был нулевым. Таким образом, это приводит к тому, что изображение будет null. Вот что я сделал:

Сначала я не получил путь к файлу из Uri, но я использовал сам Uri, чтобы получить изображение, используя следующий метод.

    private Bitmap getBitmapFromUri(Uri uri)throws IOException{
    BitmapFactory.Options options = new BitmapFactory.Options();
    InputStream inputStream = getApplicationContext().getContentResolver().openInputStream(uri);
    return BitmapFactory.decodeStream(inputStream, null, options);
}

Вы можете передать null в Options. Метод выдает IOException, поэтому убедитесь, что вы поймали это. И поэтому, когда вы хотите использовать его в своем представлении изображения:

imageView.setImageBitmap(getBitmapFromUri(data.getData()));

Также помните, как изменять размер изображений, потому что пользователь может выбрать очень большое изображение и, следовательно, занять память. Также измените свой код, чтобы изменить размер!

person Xenolion    schedule 11.10.2017

Сначала убедитесь, что вы указали все необходимые разрешения для файла manifest.xml. Тогда попробуйте с ним. Я отредактировал ваш код -

public class MainActivity extends AppCompatActivity {

    private static final int SELECTED_PICTURE=1;
    ImageView iv;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);

        iv=(ImageView)findViewById(R.id.imageView1);

        //FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab);
        //fab.setOnClickListener(new View.OnClickListener() {
            //@Override
            //public void onClick(View view) {
                //Snackbar.make(view, "Replace with your own action", Snackbar.LENGTH_LONG)
                        //.setAction("Action", null).show();
            //}
        }//);
    public void btnClick(View v){
        Intent photoPickerIntent = new Intent(Intent.ACTION_PICK);
        photoPickerIntent.setType("image/*");
        startActivityForResult(photoPickerIntent, SELECTED_PICTURE);
    }
    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);

        switch (requestCode) {
            case SELECTED_PICTURE:
                if(resultCode==RESULT_OK){
                    Uri pickedImage = data.getData();
            // Let's read picked image path using content resolver
            String[] filePath = { MediaStore.Images.Media.DATA };
            Cursor cursor = getContentResolver().query(pickedImage, filePath, null, null, null);
            cursor.moveToFirst();
            String imagePath = cursor.getString(cursor.getColumnIndex(filePath[0]));

            BitmapFactory.Options options = new BitmapFactory.Options();
            options.inPreferredConfig = Bitmap.Config.ARGB_8888;
            Bitmap bitmap = BitmapFactory.decodeFile(imagePath, options);
            cursor.close();
            iv. setImageBitmap(bitmap);

                }
                break;

            default:
                break;
        }
    }
}
person AGM Tazim    schedule 11.10.2017