2015-06-04 9 views
2

У меня есть приложение, которое имеет функцию, которая позволяет пользователю выбирать изображение из галереи. Вот код для этого, что:Выбор изображения из галереи на Nexus 5 (Android 5.1.1), возвращающий нуль, работающий на других устройствах

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

метод GetPath:

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, и она работает.

Вот StackTrace:

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) 

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

Заранее благодарим за ура!

+1

Проверьте это. http://stackoverflow.com/a/30576188 – siriscac

ответ

1

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

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

+0

Я сделал то, что вы просили, он больше не разбивается. Изображение загружается в profilePictureImageView, но когда я его сохраняю, он не сохраняется на сервере. На S2 это работает, но на Nexus 5 это не так. –

+0

@ VladIancu: «но когда я его сохраню, он не будет сохранен на сервере» - тогда вам нужно будет открыть новый вопрос о переполнении стека, где вы предоставите свой код и точные симптомы (то есть, что " не сохраняет на сервере "означает). – CommonsWare

+0

Я решил. Спасибо за помощь и интерес! –

1

Вместо передачи строки из Intent Непосредственно Пропустите Ури из 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 

} 
+0

Я решил! Спасибо, в любом случае! –

+0

@ Vlad Iancu, можете ли вы предоставить свое рабочее решение здесь. – Venugopal