標籤:des android style blog color io os ar 使用
導語:
如今的安卓應用在選擇圖片的處理上大多合并使用拍照和從相簿中選擇這兩種方式(當然這是產品dog的事,開篇跑題。。。)
今天在寫一個這樣的功能模組遇到一個尷尬的問題,同樣是拍照擷取圖片功能,在同事的三星上跑沒問題,但是在My Phone上一跑就崩(吐槽一下國產廠商對android的系統級改造真是太大,連錯誤記錄檔都打不出來,還有老闆啥時候給我配個測試機唄),下面是在某型手機上測試的報錯結果
錯誤報表:
10-21 17:41:43.634: E/AndroidRuntime(32683): FATAL EXCEPTION: main
10-21 17:41:43.634: E/AndroidRuntime(32683): java.lang.RuntimeException: Failure delivering result ResultInfo{who=null, request=10, result=-1, data=Intent { act=inline-data (has extras) }} to activity {*****}: java.lang.NullPointerException
問題分析:
這是出錯部分代碼,可以看到我直接從返回Intent中擷取uri,但實際上有些手機在拍照後uri是空的,所以null 指標異常也不奇怪了
if (resultCode == RESULT_OK) { Uri uri = data.getData(); ContentResolver cr = this.getContentResolver(); try { if (bmp != null) bmp.recycle(); bmp = BitmapFactory.decodeStream(cr.openInputStream(uri)); bmp = MediaStore.Images.Media.getBitmap(cr, uri); imagedata = StreamUtils.stream2ByteArray(cr .openInputStream(uri)); AVFile img_file = new AVFile("photo_1", imagedata); img_file.saveInBackground(); images.add(img_file); } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } photo.setImageBitmap(bmp); } else { Toast.makeText(PublishActivity.this, "請重新選擇圖片", Toast.LENGTH_SHORT).show(); }
所以解決方案就是分別處理從相簿選取和拍照這兩種情況,以便能適應更多的裝置
解決辦法
10代表拍照,20代表從相簿選取。
if (requestCode == 10) { if (resultCode == RESULT_OK) { if (bmp != null) bmp.recycle(); bmp = (Bitmap) data.getExtras().get("data"); ByteArrayOutputStream baos = new ByteArrayOutputStream(); bmp.compress(Bitmap.CompressFormat.PNG, 100, baos); imagedata = baos.toByteArray(); AVFile img_file = new AVFile("photo_1", imagedata); img_file.saveInBackground(); images.add(img_file); photo.setImageBitmap(bmp); } else { Toast.makeText(PublishActivity.this, "請重新選擇圖片", Toast.LENGTH_SHORT).show(); } } if (requestCode == 20) { if (resultCode == RESULT_OK) { Uri uri = data.getData(); ContentResolver cr = this.getContentResolver(); try { if (bmp != null) bmp.recycle(); bmp = BitmapFactory.decodeStream(cr.openInputStream(uri)); bmp = MediaStore.Images.Media.getBitmap(cr, uri); imagedata = StreamUtils.stream2ByteArray(cr .openInputStream(uri)); AVFile img_file = new AVFile("photo_1", imagedata); img_file.saveInBackground(); images.add(img_file); } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } photo.setImageBitmap(bmp); } else { Toast.makeText(PublishActivity.this, "請重新選擇圖片", Toast.LENGTH_SHORT).show(); } }
Android中擷取選擇圖片與擷取拍照返回結果差異