2016-03-11 11 views
-1

Я пытаюсь прочитать изображение с устройства Android, а затем загрузить его в Microsoft Azure Мобильный сервис.java.lang.NullPointerException: попытка вызвать виртуальный метод 'char [] java.lang.String.toCharArray()' на ссылке нулевого объекта

pickImage() и onActivityResult() методы работают хорошо, как изображение может быть успешно отображаться в Image View, используя код

mImageView.setImageURI(currImageURI); 

Когда я пытаюсь сохранить изображение с помощью saveToDo () метод есть ошибка в строке

FileInputStream fis = new FileInputStream(absoluteFilePath); 

Поэтому я пытаюсь напечатать, что именно содержит в курсоре с помощью кода

System.out.println("IMAGE: " + DatabaseUtils.dumpCursorToString(cursor)); 
System.out.println("CURRENT: " + DatabaseUtils.dumpCurrentRowToString(cursor)); 

Я получаю следующее сообщение об ошибке.

W/System.err: java.lang.NullPointerException: Attempt to invoke virtual method 'char[] java.lang.String.toCharArray()' on a null object reference 
W/System.err:  at java.io.File.fixSlashes(File.java:183) 
W/System.err:  at java.io.File.<init>(File.java:130) 
W/System.err:  at java.io.FileInputStream.<init>(FileInputStream.java:103) 

W/System.err:  at com.king.recipesharinghub.AddRecipe.saveTodo(AddRecipe.java:773) 
W/System.err:  at com.king.recipesharinghub.AddRecipe$3.onClick(AddRecipe.java:214) 

W/System.err:  at android.view.View.performClick(View.java:5198) 
W/System.err:  at android.view.View$PerformClick.run(View.java:21147) 
W/System.err:  at android.os.Handler.handleCallback(Handler.java:739) 
W/System.err:  at android.os.Handler.dispatchMessage(Handler.java:95) 
W/System.err:  at android.os.Looper.loop(Looper.java:148) 
W/System.err:  at android.app.ActivityThread.main(ActivityThread.java:5417) 
W/System.err:  at java.lang.reflect.Method.invoke(Native Method) 
W/System.err:  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726) 
W/System.err:  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616) 
I/TodoDetailsActivity: JSON: {"complete":"false","text":"This is testing"} 

Это системные выходы, где данные являются нулевыми.

I/System.out: Image URL: content://com.android.providers.media.documents/document/image%3A36 
I/System.out: PROJECTION: [Ljava.lang.String;@290e1f6 
I/System.out: DATABASE: >>>>> Dumping cursor [email protected] 
I/System.out: 0 { 
I/System.out: _data=null 
I/System.out: } 
I/System.out: <<<<< 
I/System.out: CURRENT: 0 { 
I/System.out: _data=null 
I/System.out: } 
I/System.out: INDEX: 0 
I/System.out: ABSOLUTEFILEPATH: null 

Ниже приведены полные коды

protected void pickImage() { 
    Intent intent = new Intent(Intent.ACTION_GET_CONTENT); 
    intent.setType("image/*"); 
    startActivityForResult(intent, 987); 
} 

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

    try { 
     //handle result from gallary select 
     if (requestCode == 987) { 
      Uri currImageURI = data.getData(); 
      this.mImageUrl = currImageURI; 
      //Set the image view's image by using imageUri 
      mImageView.setImageURI(currImageURI); 
     } 
    } catch (Exception ex) { 
     Log.e("TodoDetailsActivity", "Error in onActivityResult: " + ex.getMessage()); 
    } 
} 

protected void saveTodo() { 
    String imageString = null; 
    if (mImageUrl != null && !mImageUrl.equals("")) { 
     try { 
      System.out.println("Image URL: " + mImageUrl.toString()); 

      String[] projection = { MediaStore.Images.Media.DATA }; 
      System.out.println("PROJECTION: " + projection); 

      Cursor cursor = getContentResolver().query(mImageUrl, projection, 
        null, null, null); 
      cursor.moveToFirst(); 

      System.out.println("DATABASE: " + DatabaseUtils.dumpCursorToString(cursor)); 
      System.out.println("CURRENT: " + DatabaseUtils.dumpCurrentRowToString(cursor)); 

      int index = cursor 
        .getColumnIndex(MediaStore.Images.ImageColumns.DATA); 

      System.out.println("INDEX: " + index); 

      String absoluteFilePath = cursor.getString(index); 

      System.out.println("ABSOLUTEFILEPATH: " + absoluteFilePath); 

      FileInputStream fis = new FileInputStream(absoluteFilePath); 

      int bytesRead = 0; 
      ByteArrayOutputStream bos = new ByteArrayOutputStream(); 
      byte[] b = new byte[1024]; 
      while ((bytesRead = fis.read(b)) != -1) { 
       bos.write(b, 0, bytesRead); 
      } 
      byte[] bytes = bos.toByteArray(); 
      imageString = Base64.encodeToString(bytes, Base64.DEFAULT); 
     } catch (Exception ex) { 
      ex.printStackTrace(); 
     } 
    } 
    new SaveTodoTask(this).execute("This is testing", imageString); 
} 

Надежда, чтобы получить мою проблему решить, как я застрял на этот вопрос в течение нескольких дней. Спасибо!

ответ

0

следует добавить проекцию в вашем коде при вызове запроса

 // Attempt to fetch asset filename for image 
      String[] projection = { MediaStore.Images.Media.DATA }; 
photoCursor = context.getContentResolver().query(photoUri, 


           projection, null, null, null); 

только тогда вы сможете получить

int index = cursor 
        .getColumnIndex(MediaStore.Images.ImageColumns.DATA); 

Надеется, что это поможет вам.

+0

Hi @SilvansSolanki, Благодарим вас за ответ. Я попытался добавить проекцию к моему коду, но я получаю следующую ошибку. java.lang.NullPointerException: попытка вызвать виртуальный метод 'char [] java.lang.String.toCharArray()' для ссылки на нулевой объект Теперь, когда я распечатываю данные, при возврате данных нет значения. ИЗОБРАЖЕНИЯ: >>>>> сбросы курсор [email protected] I/System.out: 0 { I/System.out: _data = NULL I/System.out:} ввод/System.out: <<<<< I/System.out: CURRENT: 0 { I/System.out: _data = null I/System.out:} –

+0

Это означает, что вы получаете новое сообщение об ошибке сейчас, а не предыдущее сообщение об ошибке. Можете ли вы опубликовать обновленный код, чтобы я мог помочь вам в решении. –

+0

Привет @SilvansSolanki, я обновил свой код и полученное сообщение об ошибке. –

0

@luKing Saw, Я проверил ваш код в своем симуляторе в Eclipse. Все работало нормально.

03-15 21:17:47.706: I/dalvikvm-heap(621): Grow heap (frag case) to 11.867MB for 1228816-byte allocation 
03-15 21:17:49.296: I/System.out(621): Image URL: content://media/external/images/media/17 
03-15 21:17:49.296: I/System.out(621): PROJECTION: [Ljava.lang.String;@414b3988 
03-15 21:17:49.336: I/System.out(621): DATABASE: >>>>> Dumping cursor [email protected] 
03-15 21:17:49.336: I/System.out(621): 0 { 
03-15 21:17:49.346: I/System.out(621): _data=/mnt/sdcard/DCIM/Camera/IMG_20160315_171536.jpg 
03-15 21:17:49.346: I/System.out(621): } 
03-15 21:17:49.346: I/System.out(621): <<<<< 
03-15 21:17:49.346: I/System.out(621): CURRENT: 0 { 
03-15 21:17:49.346: I/System.out(621): _data=/mnt/sdcard/DCIM/Camera/IMG_20160315_171536.jpg 
03-15 21:17:49.356: I/System.out(621): } 
03-15 21:17:49.356: I/System.out(621): INDEX: 0 
03-15 21:17:49.356: I/System.out(621): ABSOLUTEFILEPATH: /mnt/sdcard/DCIM/Camera/IMG_20160315_171536.jpg 
03-15 21:17:51.466: I/Choreographer(621): Skipped 562 frames! The application may be doing too much work on its main thread. 

Я видел ваш путь к изображению как 'Content://com.android.providers.media.documents/document/image%3A36' , но я не уверен, что ваш код может получить доступ к папке с именем «документ» в вашем проекте. Не могли бы вы попытаться использовать изображение в SD-карте или папке src/res?