Выбор изображения из галереи на Nexus 5 (Android 5.1.1) возвращает значение null, работает на других устройствах

У меня есть приложение, в котором есть функция, которая позволяет пользователю выбирать изображение из галереи. Вот код для этого:

@OnClick(R.id.imageView_fragmentUploadLayout_uploadedArt)
public void setUploadedArtImageView () {
    //startActivityForResult(new Intent(Intent.ACTION_PICK, MediaStore.Images.Media.INTERNAL_CONTENT_URI), GET_FROM_GALLERY);
    Intent intent = new Intent();
// Show only images, no videos or anything else
    intent.setType("image/*");
    intent.setAction(Intent.ACTION_GET_CONTENT);
// Always show the chooser (if there are multiple options available)
    startActivityForResult(Intent.createChooser(intent, "Select Picture"), GET_FROM_GALLERY);

}

И метод onActivityResult:

public void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);

    //Detects request codes
    if(requestCode == GET_FROM_GALLERY && resultCode == Activity.RESULT_OK && data != null) {
        selectedImageUri = data.getData();
        selectedImagePath = getPath(selectedImageUri);

        file = new File(selectedImagePath);

        //ParseFile parseImage = new ParseFile();

        Picasso.with(getActivity())
                .load(selectedImageUri.toString())
                .resize(500, 500)
                .centerCrop()
                .noPlaceholder()
                .into(uploadedArtImageView);

        uploadedArtImageViewPlaceHolder.setVisibility(View.GONE);

        ImageResizer.resize(file, 640, 480, ResizeMode.FIT_EXACT);
    }
}

Метод получения пути:

public String getPath(Uri uri) {
    // just some safety built in
    if( uri == null ) {
        // TODO perform some logging or show user feedback
        return null;
    }
    // try to retrieve the image from the media store first
    // this will only work for images selected from gallery
    String[] projection = { MediaStore.Images.Media.DATA };
    Cursor cursor = getActivity().managedQuery(uri, projection, null, null, null);
    if( cursor != null ){
        int column_index = cursor
                .getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
        cursor.moveToFirst();
        return cursor.getString(column_index);
    }
    // this is our fallback here
    return uri.getPath();
}

Если я протестирую его на своем Samsung S2, он работает (в настоящее время на Cyanogen Mod, Android 4.0.4), но если я протестирую его на Nexus 5 (Android 5.1.1), он вернет исключение нулевого указателя.

ПРИМЕЧАНИЕ

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

Вот трассировка стека:

java.lang.RuntimeException: Failure delivering result ResultInfo{who=null, request=131075, result=-1, data=Intent { dat=content://com.android.providers.media.documents/document/image:25147 flg=0x1 }} to activity {com.entu.artapp/com.entu.artapp.activity.FragmentManager}: java.lang.NullPointerException: Attempt to invoke virtual method 'char[] java.lang.String.toCharArray()' on a null object reference
   at android.app.ActivityThread.deliverResults(ActivityThread.java:3574)
   at android.app.ActivityThread.handleSendResult(ActivityThread.java:3617)
   at android.app.ActivityThread.access$1300(ActivityThread.java:151)
   at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1352)
   at android.os.Handler.dispatchMessage(Handler.java:102)
   at android.os.Looper.loop(Looper.java:135)
   at android.app.ActivityThread.main(ActivityThread.java:5254)
   at java.lang.reflect.Method.invoke(Method.java)
   at java.lang.reflect.Method.invoke(Method.java:372)
   at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:903)
   at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:698)
Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'char[] java.lang.String.toCharArray()' on a null object reference
   at java.io.File.fixSlashes(File.java:185)
   at java.io.File.<init>(File.java:134)
   at com.entu.artapp.fragments.UploadPictureFragment.onActivityResult(UploadPictureFragment.java:363)
   at android.support.v4.app.FragmentActivity.onActivityResult(FragmentActivity.java:163)
   at android.app.Activity.dispatchActivityResult(Activity.java:6192)
   at android.app.ActivityThread.deliverResults(ActivityThread.java:3570)
   at android.app.ActivityThread.handleSendResult(ActivityThread.java:3617)
   at android.app.ActivityThread.access$1300(ActivityThread.java:151)
   at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1352)
   at android.os.Handler.dispatchMessage(Handler.java:102)
   at android.os.Looper.loop(Looper.java:135)
   at android.app.ActivityThread.main(ActivityThread.java:5254)
   at java.lang.reflect.Method.invoke(Method.java)
   at java.lang.reflect.Method.invoke(Method.java:372)
   at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:903)
   at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:698)

Можете ли вы помочь мне с этой проблемой?

Заранее спасибо, привет!


person Vlad Iancu    schedule 04.06.2015    source источник
comment
Проверь это. stackoverflow.com/a/30576188   -  person siriscac    schedule 04.06.2015


Ответы (2)


Файл Uri не является файлом. Вы не можете надежно получить локальный путь к тому, что пользователь выбирает через ACTION_GET_CONTENT. Вам нужно обращаться с Uri как с URL-адресом веб-сервера, где вы открываете потоки на Uri, будь то напрямую (getContentResolver().openInputStream()) или косвенно (через Picasso).

Я не знаю, что такое ImageResizer, но если он работает только с файлами, перестаньте его использовать. Удалите свой метод getPath() и работайте исключительно с методом Uri.

person CommonsWare    schedule 04.06.2015
comment
Я сделал то, что вы просили, он больше не падает. Изображение загружается в profilePictureImageView, но когда я его сохраняю, оно не сохраняется на сервере. На S2 работает, а на Nexus 5 нет. - person Vlad Iancu; 04.06.2015
comment
@VladIancu: но когда я сохраняю его, он не сохраняется на сервере - тогда вам нужно будет открыть новый вопрос о переполнении стека, где вы предоставляете свой код и точные симптомы (т.е. что не сохраняется на значит сервер). - person CommonsWare; 04.06.2015

Вместо передачи строки из намерения напрямую передать Uri из onActivityResult

MainActivity.class

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
// TODO Auto-generated method stub
super.onActivityResult(requestCode, resultCode, data);

    Uri imageuri=data.getData();

Intent i=new Intent(MainActivity.this,NextActivity.class);
i.putExtra("uri","imageuri");
startActivity(i);
}

NextActivtiy.class

protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_next);

    Uri geturi=getIntent().getParcelableExtra("imageuri");
    InputStream is=null;
    try {
        is = getContentResolver().openInputStream(geturi);
    } catch (FileNotFoundException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
    Bitmap bitmap=BitmapFactory.decodeStream(is);
    //Use this bitmap where you want to display the image

}
person Vivek Faldu    schedule 04.06.2015
comment
@Vlad Iancu, не могли бы вы предоставить свое рабочее решение здесь. - person Venugopal; 16.09.2016