Android-----調用系統相機拍照並把照片展示在圖庫中


此博客主要實現調用系統相機拍照,並把圖片保存到指定目錄下,更新數媒庫將圖片在圖庫中顯示,布局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);
            }
        }
    }
}

以上能實現保留原圖。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM