web-dev-qa-db-de.com

Android Bild von der Galerie in ImageView holen

Ich versuche, einer ImageView ein Foto aus der Galerie hinzuzufügen. Ich erhalte jedoch die folgende Fehlermeldung:

Java.lang.RuntimeException: Fehler beim Liefern des Ergebnisses ResultInfo {who = null, request = 1, result = -1, data = Intent { dat = Inhalt: // media/external/images/media/1}} zur Aktivität {hotMetter.pack/hotMetter.pack.GetPhoto}: Java.lang.NullPointerException

Das ist mein Code:

      Intent intent = new Intent();
      intent.setType("image/*");
      intent.setAction(Intent.ACTION_GET_CONTENT);

      startActivityForResult(Intent.createChooser(intent,"Select Picture"), SELECT_PICTURE);
}
Bitmap bitmap=null;
public void onActivityResult(int requestCode, int resultCode, Intent data)
{

    if (resultCode == Activity.RESULT_OK)
    {
        if (requestCode == SELECT_PICTURE) 
        {
             Uri selectedImageUri = data.getData();           
             selectedImagePath = getPath(selectedImageUri);             
             tv.setText(selectedImagePath);
             img.setImageURI(selectedImageUri); 
         }
    }


 public String getPath(Uri uri) 
    {
        String[] projection = { MediaStore.Images.Media.DATA };
        Cursor cursor = managedQuery(uri, projection, null, null, null);
        if (cursor == null) return null;
        int column_index =             cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
        cursor.moveToFirst();
        String s=cursor.getString(column_index);
        cursor.close();
        return s;
    }

Ich bekomme den selectedImagePath="mnt/sdcard/DCIM/myimage" aber auf img.setImageURI(selectedImageUri); bekomme ich den Fehler.

Ich habe auch eine Bitmap verwendet und versucht, das Bild von SetImageBitmap zu setzen, aber ich erhalte den gleichen Fehler.

LogCat:

05-06 19:41:34.191: E/AndroidRuntime(8466): Java.lang.RuntimeException: Failure delivering result ResultInfo{who=null, request=1, result=-1, data=Intent { dat=content://media/external/images/media/1 }} to activity {hotMetter.pack/hotMetter.pack.GetPhoto}: Java.lang.NullPointerException
05-06 19:41:34.191: E/AndroidRuntime(8466):     at Android.app.ActivityThread.deliverResults(ActivityThread.Java:2532)
05-06 19:41:34.191: E/AndroidRuntime(8466):     at Android.app.ActivityThread.handleSendResult(ActivityThread.Java:2574)
05-06 19:41:34.191: E/AndroidRuntime(8466):     at Android.app.ActivityThread.access$2000(ActivityThread.Java:117)
05-06 19:41:34.191: E/AndroidRuntime(8466):     at Android.app.ActivityThread$H.handleMessage(ActivityThread.Java:961)
05-06 19:41:34.191: E/AndroidRuntime(8466):     at Android.os.Handler.dispatchMessage(Handler.Java:99)
05-06 19:41:34.191: E/AndroidRuntime(8466):     at Android.os.Looper.loop(Looper.Java:123)
05-06 19:41:34.191: E/AndroidRuntime(8466):     at Android.app.ActivityThread.main(ActivityThread.Java:3683)
05-06 19:41:34.191: E/AndroidRuntime(8466):     at Java.lang.reflect.Method.invokeNative(Native Method)
05-06 19:41:34.191: E/AndroidRuntime(8466):     at Java.lang.reflect.Method.invoke(Method.Java:507)
05-06 19:41:34.191: E/AndroidRuntime(8466):     at com.Android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.Java:839)
05-06 19:41:34.191: E/AndroidRuntime(8466):     at com.Android.internal.os.ZygoteInit.main(ZygoteInit.Java:597)
05-06 19:41:34.191: E/AndroidRuntime(8466):     at dalvik.system.NativeStart.main(Native Method)
05-06 19:41:34.191: E/AndroidRuntime(8466): Caused by: Java.lang.NullPointerException
05-06 19:41:34.191: E/AndroidRuntime(8466):     at hotMetter.pack.GetPhoto.onActivityResult(GetPhoto.Java:55)
05-06 19:41:34.191: E/AndroidRuntime(8466):     at Android.app.Activity.dispatchActivityResult(Activity.Java:3908)
05-06 19:41:34.191: E/AndroidRuntime(8466):     at Android.app.ActivityThread.deliverResults(ActivityThread.Java:2528)

Beratung bitte. Danke!

51
user1378505

Führen Sie die App im Debug-Modus aus und legen Sie einen Haltepunkt für if(requestCode == SELECT_PICTURE) fest. Überprüfen Sie jede Variable, während Sie durchgehen, um sicherzustellen, dass sie wie erwartet eingestellt wird. Wenn Sie eine NPE für img.setImageURI(selectedImageUri); erhalten, werden img oder selectedImageUri nicht festgelegt. 

8
techiServices

Einfacher Pass Intent zuerst:

Intent i = new Intent(Intent.ACTION_PICK,Android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
startActivityForResult(i, RESULT_LOAD_IMAGE);

Und Sie werden Bildpfad auf Ihrer onActivityResult bekommen:

@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) {
            Uri selectedImage = data.getData();
            String[] filePathColumn = { MediaStore.Images.Media.DATA };
            Cursor cursor = getContentResolver().query(selectedImage,filePathColumn, null, null, null);
            cursor.moveToFirst();
            int columnIndex = cursor.getColumnIndex(filePathColumn[0]);
            String picturePath = cursor.getString(columnIndex);
            cursor.close();
            ImageView imageView = (ImageView) findViewById(R.id.imgView);
            imageView.setImageBitmap(BitmapFactory.decodeFile(picturePath));
        }
    }

für den vollständigen Quellcode hier

109
Parag Chauhan

Versuche Folgendes:

import Java.io.FileDescriptor;
import Java.io.IOException;
import Android.app.Activity;
import Android.content.Intent;
import Android.database.Cursor;
import Android.graphics.Bitmap;
import Android.graphics.BitmapFactory;
import Android.net.Uri;
import Android.os.Bundle;
import Android.os.ParcelFileDescriptor;
import Android.provider.MediaStore;
import Android.view.View;
import Android.widget.Button;
import Android.widget.ImageView;

public class ImageGalleryDemoActivity extends Activity {


    private static int RESULT_LOAD_IMAGE = 1;

    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        Button buttonLoadImage = (Button) findViewById(R.id.buttonLoadPicture);
        buttonLoadImage.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View arg0) {

                Intent i = new Intent(
                        Intent.ACTION_PICK,
                        Android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI);

                startActivityForResult(i, RESULT_LOAD_IMAGE);
            }
        });
    }


    @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) {
            Uri selectedImage = data.getData();
            String[] filePathColumn = { MediaStore.Images.Media.DATA };

            Cursor cursor = getContentResolver().query(selectedImage,
                    filePathColumn, null, null, null);
            cursor.moveToFirst();

            int columnIndex = cursor.getColumnIndex(filePathColumn[0]);
            String picturePath = cursor.getString(columnIndex);
            cursor.close();

            ImageView imageView = (ImageView) findViewById(R.id.imgView);

            Bitmap bmp = null;
            try {
                bmp = getBitmapFromUri(selectedImage);
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            imageView.setImageBitmap(bmp);

        }


    }



    private Bitmap getBitmapFromUri(Uri uri) throws IOException {
        ParcelFileDescriptor parcelFileDescriptor =
                getContentResolver().openFileDescriptor(uri, "r");
        FileDescriptor fileDescriptor = parcelFileDescriptor.getFileDescriptor();
        Bitmap image = BitmapFactory.decodeFileDescriptor(fileDescriptor);
        parcelFileDescriptor.close();
        return image;
    }


}
18

@parags Code funktioniert super. Beim Laden einiger großer Bilder können Sie jedoch fehlschlagen. Du solltest benutzen;

imageView.setImageBitmap(getScaledBitmap(picturePath, 800, 800));

anstatt; 

imageView.setImageBitmap(BitmapFactory.decodeFile(picturePath));

Hier sind meine Methoden, die Sie verwenden können.

private Bitmap getScaledBitmap(String picturePath, int width, int height) {
    BitmapFactory.Options sizeOptions = new BitmapFactory.Options();
    sizeOptions.inJustDecodeBounds = true;
    BitmapFactory.decodeFile(picturePath, sizeOptions);

    int inSampleSize = calculateInSampleSize(sizeOptions, width, height);

    sizeOptions.inJustDecodeBounds = false;
    sizeOptions.inSampleSize = inSampleSize;

    return BitmapFactory.decodeFile(picturePath, sizeOptions);
}

private int calculateInSampleSize(BitmapFactory.Options options, int reqWidth, int reqHeight) {
    // Raw height and width of image
    final int height = options.outHeight;
    final int width = options.outWidth;
    int inSampleSize = 1;

    if (height > reqHeight || width > reqWidth) {

        // Calculate ratios of height and width to requested height and
        // width
        final int heightRatio = Math.round((float) height / (float) reqHeight);
        final int widthRatio = Math.round((float) width / (float) reqWidth);

        // Choose the smallest ratio as inSampleSize value, this will
        // guarantee
        // a final image with both dimensions larger than or equal to the
        // requested height and width.
        inSampleSize = heightRatio < widthRatio ? heightRatio : widthRatio;
    }

    return inSampleSize;
}
16
Devrim

Dies ist der einfachste Weg, um ein Bild von der Galerie und dem Ausschnitt zu erhalten

schritt 1: StartActivity für das Ergebnis

imageUser.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {

            Intent intent = new Intent(Intent.ACTION_PICK,
                    MediaStore.Images.Media.INTERNAL_CONTENT_URI);
            intent.setType("image/*");
            intent.putExtra("crop", "true");
            intent.putExtra("scale", true);
            intent.putExtra("outputX", 256);
            intent.putExtra("outputY", 256);
            intent.putExtra("aspectX", 1);
            intent.putExtra("aspectY", 1);
            intent.putExtra("return-data", true);
            startActivityForResult(intent, 1);

            }
    });

schritt 2: Behandeln Sie das Ergebnis

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    if (resultCode != RESULT_OK) {
        return;
    }
    if (requestCode == 1) {
        final Bundle extras = data.getExtras();
        if (extras != null) {
            //Get image
            Bitmap ProfilePic = extras.getParcelable("data");
            imageUser.setImageBitmap(ProfilePic);
            TextView t=(TextView)findViewById(R.id.textoverimage);
            t.setText("image Selected");
        }
    }


}
11
Adiii

Ich denke, der einfachste Weg ist es, die Bibliothek ContentManager zu verwenden. Diese Bibliothek zum Abrufen von Fotos oder Videos von einer Gerätegalerie, einer Cloud oder einer Kamera. Mit asynchronem Laden aus der Cloud und Fehlerbehebung für einige problematische Geräte.

Download über Gradle: compile 'com.github.stfalcon:contentmanager:0.4.3' Die Dokumentation finden Sie unter https://github.com/stfalcon-studio/ContentManager

2
Anton Bevza
import Android.content.Intent;
import Android.net.Uri;
import Android.provider.MediaStore;
import Android.support.v7.app.AppCompatActivity;
import Android.os.Bundle;
import Android.view.View;
import Android.widget.ImageView;

public class MainActivity extends AppCompatActivity {

    ImageView img;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        img = (ImageView)findViewById(R.id.imageView);
    }

    public void btn_gallery(View view) {

        Intent intent =new Intent(Intent.ACTION_PICK, MediaStore.Images.Media.INTERNAL_CONTENT_URI);

        startActivityForResult(intent,100);
    }

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

        if (requestCode==100 && resultCode==RESULT_OK)
        {
            Uri uri = data.getData();
            img.setImageURI(uri);
        }
    }
}
2
abdo most

fügen Sie den Code in das Button-Klick-Ereignis ein

Intent ImageIntent = new Intent(Intent.ACTION_PICK,               
MediaStore.Images.Media.EXTERNAL_CONTENT_URI); //implicit intent
UploadImage.this.startActivityForResult(ImageIntent,99);

unter code in startActivityforResult -Ereignis eingefügt

Uri ImagePathAndName = data.getData();
imgpicture.setImageURI(ImagePathAndName);

ich denke, Ihr ImageView img ist nicht gleich dem Compiler gleich null; Deshalb wird eine NullPointerException ausgelöst 

hast du in deiner tätigkeit angerufen?

img = (ImageView) findViewById(R.id.my_imageview);

wobei my_imageview die ID Ihres ImageView-Widgets ist !!

1
K_Anas

Hier ist der Code, der für mich funktioniert hat.

Button buttonLoadImage = (Button) findViewById(R.id.button4);
    buttonLoadImage.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            Intent intent = new Intent(Intent.ACTION_PICK,
                    MediaStore.Images.Media.INTERNAL_CONTENT_URI);
            intent.setType("image/*");
            intent.putExtra("crop", "true");
            intent.putExtra("scale", true);
            intent.putExtra("outputX", 256);
            intent.putExtra("outputY", 256);
            intent.putExtra("aspectX", 1);
            intent.putExtra("aspectY", 1);
            intent.putExtra("return-data", true);
            startActivityForResult(intent, 1);}});
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    if (resultCode != RESULT_OK) {

        if (requestCode == RESULT_LOAD_IMAGE && data != null) {
            Uri imageUri = data.getData();
            imageView = (ImageView) findViewById(R.id.imgView);
            imageView.setImageURI(imageUri);}}}

in Manifest-Datei hinzufügen

<uses-permission Android:name="Android.permission.READ_EXTERNAL_STORAGE" />

Die ursprüngliche Antwort lautet, dass Ihr Pfad dem Präfix wie .__ beitreten muss. Uri.parse ("file: //" + file.getPath);

1
user3419036

@Parag Chauhan-Lösung funktioniert gut, aber ich hatte ein Problem - einige Dateimanager-Apps kehren im Intent-Objekt "file: /// ..." anstelle von "content: // ..." zurück - was für die Abfrage erforderlich ist .

Es gibt meine kurze Lösung für dieses Problem:

public String getRealPathFromURI(Context context, Uri contentUri) {
    Cursor cursor = null;
    try {

        if("content".equals(contentUri.getScheme())) {
            String[] proj = {MediaStore.Images.Media.DATA};
            cursor = context.getContentResolver().query(contentUri, proj, null, null, null);
            int column_index = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
            cursor.moveToFirst();
            return cursor.getString(column_index);
        }
        else{
            return contentUri.getPath();
        }


    } finally {
        if (cursor != null) {
            cursor.close();
        }
    }
}    

Basierend auf der @Parag-Lösung

teillösung hier (@nobre) Android: Abrufen einer Datei-URI von einer Inhalts-URI?

parital-Lösung hier (@Nikolay) Ermittelt Dateinamen und Pfad von URI aus Mediastore

0
Krystian

parag-chauhan und devrim Die Antworten sind perfekt, aber ich ändere das onActivityResult ohne Cursor, und der Code wird dadurch viel besser.

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

    if (requestCode == RESULT_LOAD_IMAGE && resultCode == RESULT_OK && data != null) {
        Uri selectedImage = data.getData();
        try {
           ImageView imageView = (ImageView) findViewById(R.id.imgView);
           imageView.setImageBitmap(getScaledBitmap(selectedImage,800,800));
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        }
    }
}

private Bitmap getScaledBitmap(Uri selectedImage, int width, int height) throws FileNotFoundException {
    BitmapFactory.Options sizeOptions = new BitmapFactory.Options();
    sizeOptions.inJustDecodeBounds = true;
    BitmapFactory.decodeStream(getContentResolver().openInputStream(selectedImage), null, sizeOptions);

    int inSampleSize = calculateInSampleSize(sizeOptions, width, height);

    sizeOptions.inJustDecodeBounds = false;
    sizeOptions.inSampleSize = inSampleSize;

    return BitmapFactory.decodeStream(getContentResolver().openInputStream(selectedImage), null, sizeOptions);
}

private int calculateInSampleSize(BitmapFactory.Options options, int reqWidth, int reqHeight) {
    // Raw height and width of image
    final int height = options.outHeight;
    final int width = options.outWidth;
    int inSampleSize = 1;

    if (height > reqHeight || width > reqWidth) {
        // Calculate ratios of height and width to requested one
        final int heightRatio = Math.round((float) height / (float) reqHeight);
        final int widthRatio = Math.round((float) width / (float) reqWidth);

        // Choose the smallest ratio as inSampleSize value
        inSampleSize = heightRatio < widthRatio ? heightRatio : widthRatio;
    }
    return inSampleSize;
}
0
Ali_dev