此博客主要實現調用系統相機拍照,並把圖片保存到指定目錄下,更新數媒庫將圖片在圖庫中顯示,布局xml代碼:
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" android:gravity="center" android:background="@drawable/back_1" tools:context="com.org.youtu.MainActivity"> <Button android:id="@+id/btn_photo" android:layout_width="80dp" android:layout_height="60dp" android:layout_alignParentBottom="true" android:layout_centerHorizontal="true" android:background="@drawable/image" android:layout_marginBottom="30sp"/> </LinearLayout>
邏輯處理代碼:
public class MainActivity extends AppCompatActivity implements View.OnClickListener{ private Button takePhoto; private Uri imageUri;//圖片路徑 private String filename;//圖片名稱 @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); this.requestWindowFeature(Window.FEATURE_NO_TITLE); this.getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN); setContentView(R.layout.activity_main); requestPermissions(); //權限申請 takePhoto = this.findViewById(R.id.btn_photo); takePhoto.setOnClickListener(this); } @Override public void onClick(View view) { switch (view.getId()){ case R.id.btn_photo: Intent intent = new Intent("android.media.action.IMAGE_CAPTURE"); //照相 startActivityForResult(intent,1008); //啟動照相 break; } } @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode,resultCode,data); if (resultCode != RESULT_OK){ Toast.makeText(MainActivity.this, "ActivityResult返回碼錯誤!", Toast.LENGTH_SHORT).show(); return; } switch (requestCode){ case 1008: saveCameraImage(data); break; } } /**【申請手機相機和內存讀取權限】**/ public void requestPermissions(){ String [] permissions = new String[] { Manifest.permission.READ_EXTERNAL_STORAGE, Manifest.permission.WRITE_EXTERNAL_STORAGE, Manifest.permission.CAMERA, Manifest.permission.RECORD_AUDIO, }; ActivityCompat.requestPermissions(MainActivity.this,permissions,100); } /**【保存相機拍的圖片】**/ public void saveCameraImage(Intent data){ String path = Environment.getExternalStorageDirectory().toString() + "/DCIM/youtu/"; File newFolder = new File(path); if (!newFolder.exists()){ boolean isfal = newFolder.mkdirs(); Log.e("isfal","創建目錄:"+path+"<-狀態->" + isfal); } Log.e("path","路徑:"+path); SimpleDateFormat format = new SimpleDateFormat("yyyyMMddHHmmss"); Date date = new Date(System.currentTimeMillis()); filename = format.format(date); File outputImage = new File(newFolder,filename+".jpg"); FileOutputStream out = null; BufferedOutputStream bos = null; try { out = new FileOutputStream(outputImage); bos = new BufferedOutputStream(out); Bitmap bitmap = (Bitmap) data.getExtras().get("data");// 解析返回的圖片成bitmap bitmap.compress(Bitmap.CompressFormat.JPEG,100,bos); /**【通知媒體庫更新數據庫,在圖庫中能看到圖片】**/ MediaStore.Images.Media.insertImage(getContentResolver(),bitmap,null,null); } catch (FileNotFoundException e) { e.printStackTrace(); }finally { try { bos.flush(); bos.close(); } catch (IOException e) { e.printStackTrace(); } } } }
不要忘了在AndroidManifest.xml中加入
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /> <uses-permission android:name="android.permission.CAMERA" /> <uses-permission android:name="android.permission.RECORD_AUDIO" />
以上皆參考網上資料實現。
以上實現方法會存在兩份照片,指定目錄中有一份,圖庫中有一份,且我發現圖庫中的圖片拍出來的效果較模糊
下面獲取較清晰圖片的解決辦法
public class MainActivity extends AppCompatActivity implements View.OnClickListener{ private Button takePhoto , btn_setting , btn_write , btn_mske , btn_icon; private Uri imageUri;//圖片路徑 private String filename;//圖片名稱 private File operateFile;//操作文件 @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); this.requestWindowFeature(Window.FEATURE_NO_TITLE); this.getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN); setContentView(R.layout.activity_main); /** * android.os.FileUriExposedException: file:///storage/emulated/0/ilive/images/photophoto.jpeg * exposed beyond app through ClipData.Item.getUri() * 下面三行解決此處問題 * **/ StrictMode.VmPolicy.Builder builder = new StrictMode.VmPolicy.Builder(); StrictMode.setVmPolicy(builder.build()); builder.detectFileUriExposure(); requestPermissions(); //權限申請 takePhoto = this.findViewById(R.id.btn_photo); takePhoto.setOnClickListener(this); } @Override public void onClick(View view) { switch (view.getId()){ case R.id.btn_photo: Intent intent = new Intent("android.media.action.IMAGE_CAPTURE"); //照相 filename = saveFileName(); operateFile = new File(filename); imageUri = Uri.fromFile(operateFile); intent.putExtra(MediaStore.EXTRA_OUTPUT, imageUri); //指定圖片輸出地址 startActivityForResult(intent,1008); //啟動照相 break; } } @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode,resultCode,data); if (resultCode != RESULT_OK){ deleteFile(operateFile); //將指定路徑圖片刪去僅保留圖庫圖片 Toast.makeText(MainActivity.this, "ActivityResult返回碼錯誤!", Toast.LENGTH_SHORT).show(); return; } switch (requestCode){ case 1008: saveCameraImage(data); deleteFile(operateFile); //將指定路徑圖片刪去僅保留圖庫圖片 break; } } /**【申請手機相機和內存讀取權限】**/ public void requestPermissions(){ String [] permissions = new String[] { Manifest.permission.READ_EXTERNAL_STORAGE, Manifest.permission.WRITE_EXTERNAL_STORAGE, Manifest.permission.CAMERA, Manifest.permission.RECORD_AUDIO, }; ActivityCompat.requestPermissions(MainActivity.this,permissions,100); } /**【保存相機拍的圖片】**/ public void saveCameraImage(Intent data){ FileInputStream inputStream = null; try { inputStream = new FileInputStream(filename); Bitmap bitmap = BitmapFactory.decodeStream(inputStream); /**【通知媒體庫更新數據庫,在圖庫中能看到圖片,且圖片是另外再保存一張】**/ MediaStore.Images.Media.insertImage(getContentResolver(),bitmap,null,null); } catch (FileNotFoundException e) { e.printStackTrace(); }finally { try { inputStream.close(); } catch (IOException e) { e.printStackTrace(); } } } /**【保存文件的名字以及目錄】**/ private String saveFileName(){ String path = Environment.getExternalStorageDirectory().toString() + "/DCIM/youtu/"; File newFolder = new File(path); if (!newFolder.exists()){ boolean isfal = newFolder.mkdirs(); Log.e("isfal","創建目錄:"+path+"<-狀態->" + isfal); } Log.e("path","路徑:"+path); SimpleDateFormat format = new SimpleDateFormat("yyyyMMddHHmmss"); Date date = new Date(System.currentTimeMillis()); String name = path + format.format(date) +".jpg"; Log.e("FileName","保存文件路徑和名字:" + name); return name; } /**【刪除文件】**/ private void deleteFile(File file){ if (file.exists()){ //文件是否存在 if (file.isFile()){ //是否是文件 boolean isDel = file.delete(); Log.e("文件刪除狀態","<-=->"+isDel); } } } }
以上能實現保留原圖。