android調用系統相機並獲取圖片


如果不是特別的要求,通過拍照的方式取得圖片的話,我們一般調用系統的拍照來完成這項工作,而沒必要再自己去實現一個拍照功能。調用系統相機很簡單,只需要一個intent就可以跳轉到相幾界面,然后再通過onActivityResult來取得圖片即可。

Intent openCameraIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); //系統常量, 啟動相機的關鍵
startActivityForResult(openCameraIntent, REQUEST_CODE_TAKE_PICTURE); // 參數常量為自定義的request code, 在取返回結果時有用

保存得到的圖片

protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        switch (requestCode) {
            case REQUEST_CODE_TAKE_PICTURE:
                if ( resultCode == RESULT_OK) {
                    Bitmap bm = (Bitmap) data.getExtras().get("data");
                    savePath = FileUtil.saveBitmap(bm);
                    img.setImageBitmap(bm);
                }
                break;
        }
    }

經過測試發現,保存圖片后的圖片與拍照時的預覽圖片對比后,發現前者失真嚴重。原因是現在相機的像素都很大,隨便一張圖片都上M,而Android系統分配給每個應用的最大內存是16M,如果直接將圖片通過內存方式返回給調用者會占用過大的內存,因此這里得到的是一個處理后的縮略圖。

第二種方法獲取圖片,就是在intent里指定圖片保存位置,這種方法取得的是原圖, 代碼如下

Intent openCameraIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
        String f = System.currentTimeMillis()+".jpg";
        Uri fileUri = Uri.fromFile(new File(Environment.getExternalStoragePublicDirectory("").getPath()+f));
        openCameraIntent.putExtra(MediaStore.EXTRA_OUTPUT, fileUri); //指定圖片存放位置,指定后,在onActivityResult里得到的Data將為null
        startActivityForResult(openCameraIntent, REQUEST_CODE_TAKE_PICTURE);

圖片裁剪

case TAKE_PHOTO:  
        Intent intent = new Intent("com.android.camera.action.CROP"); //剪裁  
        intent.setDataAndType(imageUri, "image/*");  
        intent.putExtra("scale", true);  
        //設置寬高比例  
        intent.putExtra("aspectX", 1);  
        intent.putExtra("aspectY", 1);  
        //設置裁剪圖片寬高  
        intent.putExtra("outputX", 340);  
        intent.putExtra("outputY", 340);  
        intent.putExtra(MediaStore.EXTRA_OUTPUT, imageUri);  
        Toast.makeText(MainActivity.this, "剪裁圖片", Toast.LENGTH_SHORT).show();  
        //廣播刷新相冊   
        Intent intentBc = new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE);  
        intentBc.setData(imageUri);       
        this.sendBroadcast(intentBc);      
        startActivityForResult(intent, CROP_PHOTO); //設置裁剪參數顯示圖片至ImageView  
        break;  
    case CROP_PHOTO:  
        try {      
            //圖片解析成Bitmap對象  
            Bitmap bitmap = BitmapFactory.decodeStream(  
                    getContentResolver().openInputStream(imageUri));  
            Toast.makeText(MainActivity.this, imageUri.toString(), Toast.LENGTH_SHORT).show();  
            showImage.setImageBitmap(bitmap); //將剪裁后照片顯示出來  
        } catch(FileNotFoundException e) {  
            e.printStackTrace();  
        }  
        break;  

 


免責聲明!

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



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