2015-05-16 5 views
2

У меня возникла простая проблема, которая может показаться легкой, однако, когда я выбираю изображение из галереи и пытаюсь установить его в образе просмотра в onActivityResult, ошибка появится.Невозможно получить растровое изображение из галереи с Intent.ACTION_PICK

java.lang.RuntimeException: Failure delivering result ResultInfo{who=null, request=1, result=-1, data=Intent { dat=content://media/external/images/media/35 }} to activity {com.mypackagename/com.mypackagename.SQLiteActivity}: java.lang.NullPointerException: Attempt to invoke virtual method 'void android.widget.TextView.setText(java.lang.CharSequence)' on a null object reference 

Эта ошибка должна быть вызвана нулевым объектом. Это означает, что данные не были получены? Я полагаю, что настройки, которые я сделал, не имели проблем, однако я, возможно, что-то пропустил. Я установил образец кода ниже.

Это код, который вызывает галерею

public void settingImage(View v){ 
    Intent i = new Intent(
      Intent.ACTION_PICK, 
      android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI); 

    startActivityForResult(i, RESULT_LOAD_IMAGE); 
} 

Этот код предназначен для получения результатов

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

    if (data != null) { 
     Uri selectedImage = data.getData(); 
     String[] filePathColumn = { MediaStore.Images.Media.DATA }; 
     Cursor cursor = getApplicationContext().getContentResolver().query(selectedImage, 
       filePathColumn, null, null, null); 

     cursor.moveToFirst(); 
     int columnIndex = cursor.getColumnIndex(filePathColumn[0]); 
     String picturePath = cursor.getString(columnIndex); 
     // Log.d("Path", picturePath); 
     //sampleimage.setImageBitmap(BitmapFactory.decodeFile(picturePath)); 
     // imgPath = picturePath; 
     icontext.setText(picturePath); 
     cursor.close(); 
    } else { 

    } 
} 

Вот некоторые настройки

private static int RESULT_LOAD_IMAGE = 1; 

установка основной SDK

minSdkVersion 14 
targetSdkVersion 22 
+0

'icontext' является нулевым, по этой причине NullPointe Исключено исключение rException. Где вы его инициализируете? Пожалуйста, напишите больше кода –

+1

Кроме того, вы сказали, что пытаетесь настроить его в «ImageView», но вы используете «TextView» в своем коде. Не могли бы вы дважды проверить, что вы не просто ссылаетесь на неправильный объект? –

+0

Нет, это означает, что ваш код в 'onActivityResult()' нарушен, особенно на современных устройствах Android. ['Uri' не файл] (https://commonsware.com/blog/2014/07/04/uri-not-necessarily-file.html); вы не можете достоверно преобразовать 'Uri' в некоторый путь к файлу. – CommonsWare

ответ

3

меня попробовать это, чтобы получить Bitmap,

код, который вызывает галерея сборщика,

Intent photoPickerIntent = new Intent(Intent.ACTION_PICK); 
    photoPickerIntent.setType("image/*"); 
    startActivityForResult(photoPickerIntent, SELECT_PHOTO); 

получения результатов растровый

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

    switch (requestCode) { 
     case SELECT_PHOTO: 
      if (resultCode == RESULT_OK) { 
       Uri selectedImage = imageReturnedIntent.getData();     

       //yourSelectedImage = BitmapFactory.decodeStream(imageStream); 
       try { 
        yourSelectedImage = decodeUri(selectedImage); 
       } catch (FileNotFoundException e) { 
        e.printStackTrace(); 
       } 
      // imgViewProfilePic.setImageBitmap(yourSelectedImage);     
      } 
    } 
} 

декодировать Ури,

private Bitmap decodeUri(Uri selectedImage) throws FileNotFoundException { 

    // Decode image size 
    BitmapFactory.Options o = new BitmapFactory.Options(); 
    o.inJustDecodeBounds = true; 
    BitmapFactory.decodeStream(getContentResolver().openInputStream(selectedImage), null, o); 

    // The new size we want to scale to 
    final int REQUIRED_SIZE = 140; 

    // Find the correct scale value. It should be the power of 2. 
    int width_tmp = o.outWidth, height_tmp = o.outHeight; 
    int scale = 1; 
    while (true) { 
     if (width_tmp/2 < REQUIRED_SIZE 
       || height_tmp/2 < REQUIRED_SIZE) { 
      break; 
     } 
     width_tmp /= 2; 
     height_tmp /= 2; 
     scale *= 2; 
    } 

    // Decode with inSampleSize 
    BitmapFactory.Options o2 = new BitmapFactory.Options(); 
    o2.inSampleSize = scale; 
    return BitmapFactory.decodeStream(getContentResolver().openInputStream(selectedImage), null, o2); 

} 
Смежные вопросы