Pytanie w sprawie android, image-gallery, gallery, imageview, getimagedata – Android pobierz obraz z galerii do ImageView

51

Próbuję dodać zdjęcie z galerii do aImageView ale dostaję ten błąd:

java.lang.RuntimeException: Wynik dostarczania błędu ResultInfo {who = null, request = 1, result = -1, data = Intent {dat = content: // media / external / images / media / 1}} do activity {hotMetter. pack / hotMetter.pack.GetPhoto}: java.lang.NullPointerException

To jest mój kod:

<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;
    }
</code>

DostajęselectedImagePath="mnt/sdcard/DCIM/myimage" ale naimg.setImageURI(selectedImageUri); dostaję błąd.

Użyłem też aBitmap i próbowałem ustawić obraz zSetImageBitmap ale mam ten sam błąd.

LogCat:

<code>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)
</code>

Porada proszę. Dzięki!

Czy możesz pisaćLogCat wydajność? techiServices
Dodałem LogCat, proszę spojrzeć. Dzięki user1378505
Dzięki! Masz rację, że img nie został poprawnie ustawiony. user1378505
Uruchom aplikację w trybie debugowania i włącz punkt przerwaniaif (requestCode == SELECT_PICTURE) i sprawdzaj każdą zmienną w miarę przechodzenia, aby upewnić się, że jest ustawiona zgodnie z oczekiwaniami. Jeśli masz NPE naimg.setImageURI(selectedImageUri); wtedy teżimg lubselectedImageUri nie są ustawione. techiServices
Uczyniłem to odpowiedzią. Wdzięczny, jeśli to zaakceptujesz. techiServices

Twoja odpowiedź

3   odpowiedź
18

Spróbuj wykonać następujące czynności:

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


}
ale aktywność jest mało opóźniona podczas przewijania w górę iw dół aktywności. Mohammed Sufian
wypróbowałem wszystkie podane tutaj odpowiedzi, ale tylko twoje działa świetnie. wielkie dzięki. Mohammed Sufian
8

(requestCode == SELECT_PICTURE) i sprawdzaj każdą zmienną w miarę przechodzenia, aby upewnić się, że jest ustawiona zgodnie z oczekiwaniami. Jeśli masz NPE naimg.setImageURI(selectedImageUri); wtedy teżimg lubselectedImageUri nie są ustawione.

109

Proste przejścieIntent pierwszy:

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

I otrzymasz ścieżkę obrazu na swoimonActivityResult:

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

dla pełnego kodu źródłowegotutaj

Jeśli importowany jest import android.provider.MediaStore, możesz napisać „MediaStore.Images.Media.EXTERNAL_CONTENT_URI” zamiast „android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI” Horatio
Mogą istnieć pewne wyjątki (nie wyjątki java;)) - metoda .query dla URI pobiera poprawne dane, tylko gdy intencja zawiera dane zaczynające się od dat = content: // ... Mam jedną aplikację eksploratora plików, która zwraca plik dat = " : /// ... - Nie mogę znaleźć dobrego rozwiązania tego ... Krystian
Musisz mieć pozwolenie, aby to działało: <używa-uprawnienia android: nazwa = "android.permission.READ_EXTERNAL_STORAGE" /> Pranav Mahajan

Powiązane pytania