Android頭像--拍照上傳
阿新 • • 發佈:2019-01-27
今天早上想給上次的頭像增加拍照上傳功能,不單單是相簿選擇。於是遇見了好多麻煩。
首先,dialog改成兩個選項;
AlertDialog.Builder builder = new AlertDialog.Builder(Myfragment_tx.this); builder.setTitle("選擇圖片"); final String[] items = {"拍照","從相簿中選擇"}; builder.setItems(items, new DialogInterface.OnClickListener(){ public void onClick(DialogInterface dialog, int which) { switch (which){ case 0: openCamera(); break; case 1: Intent intent = new Intent(Intent.ACTION_PICK,android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI); intent.setType("image/*"); startActivityForResult(intent, 0); break; } } }); AlertDialog dialog = builder.create(); dialog.setCanceledOnTouchOutside(true); dialog.show();
然後測試就炸了,開始修正工作,告訴是這個樣子的---->public void openCamera(){ SimpleDateFormat formatter = new SimpleDateFormat ("yyyy_MM_dd_HH_mm_ss"); Date curDate = new Date(System.currentTimeMillis());//獲取當前時間 String str = formatter.format(curDate); Intent intent1 = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); File file = new File(Environment.getExternalStorageDirectory()+"/lrsa/img/", "head"+str+".jpg"); outPutFile = Uri.fromFile(file); intent1.putExtra(MediaStore.EXTRA_OUTPUT, outPutFile); startActivityForResult(intent1, 1); }
java.lang.SecurityException: Permission Denial: starting Intent { act=android.media.action.IMAGE_CAPTURE flg=0x3 cmp=android/com.android.internal.app.ResolverActivity clip={text/uri-list U:file:///storage/emulated/0/lrsa/img/test.jpg} (has extras) } from ProcessRecord{7c18b6c 9475:com.dareway.apps.lrsa/u0a246} (pid=9475, uid=10246) with revoked permission android.permission.CAMERA
好吧,看在的英語水平還過關的份上,我認出貌似許可權的問題,找相機許可權
<uses-permission android:name="android.permission.CAMERA" /> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
但是這兩個都加了,再菜也不能忘記這兩個對吧,改動了一下發現還是不可用。就想到一個問題,好吧,又是該死的版本許可權問題,Android6.0和以前不一樣,舊的可以直接那麼寫,但新的要求這麼玩--->
if( MainActivity.this.checkSelfPermission(Manifest.permission.CAMERA) != PackageManager.PERMISSION_GRANTED ) { // 申請一個(或多個)許可權,並提供用於回撥返回的獲取碼(使用者定義) requestPermissions(new String[]{ Manifest.permission.CAMERA}, MY_PERMISSIONS_REQUEST_CALL); }
public void onRequestPermissionsResult(int requestCode,String[] permissions, int[] grantResults) { super.onRequestPermissionsResult(requestCode, permissions,grantResults); ....... }
看了看問題在這裡-->重要的事情說三遍:請記得動態授權,動態授權,動態授權。 相機啟動了,也拍照了,然後就結束了,對,平平淡淡的沒有反應,這是什麼鬼,這不是我的需求!這是之前的程式碼,我做個一個intent data檢測,看看是不是為空,結果用相機拍照,果然會為空,data為null。 protected void onActivityResult(int requestCode, int resultCode, Intent data) { Bitmap bitmap = null; if(data==null){ return;//當data為空的時候,不做任何處理 } if(requestCode==0){ try { //通過URI得到輸入流 InputStream inputStream = getContentResolver().openInputStream(data.getData()); //通過輸入流得到bitmap物件 BitmapFactory.Options opts = new BitmapFactory.Options(); opts.inSampleSize = 4; bitmap = BitmapFactory.decodeStream(inputStream,null,opts); filePath=getPath.getPath(this,data.getData()); } catch (IOException e) { e.printStackTrace(); } } imageView.setImageBitmap(bitmap); }
據說在Camera應用程式,有如何處理返回值data問題!人家是這麼玩的--->預設情況下,即不需要指定intent.putExtra(MediaStore.EXTRA_OUTPUT, uri);照相機有自己預設的儲存路徑,但是如果指定了目標uri,data就沒有資料,如果沒有指定uri,則data就返回有資料!這是真的。然後我改成這個模樣了--->File file = new File(Environment.getExternalStorageDirectory()+"/lrsa/img/", "head"+str+".jpg"); outPutFile = Uri.fromFile(file); intent1.putExtra(MediaStore.EXTRA_OUTPUT, outPutFile);
然後暫時還沒發現什麼問題。這只是我的筆記,不是技術貼,所以不嚴謹,有問題歡迎討論。if(requestCode==1){ InputStream inputStream = null; try { inputStream = getContentResolver().openInputStream(outPutFile); //通過輸入流得到bitmap物件 BitmapFactory.Options opts = new BitmapFactory.Options(); opts.inSampleSize = 4; bitmap = BitmapFactory.decodeStream(inputStream,null,opts); filePath=getPath.getPath(this,outPutFile); } catch (FileNotFoundException e) { e.printStackTrace(); } }else { return;//當data為空的時候,不做任何處理 }