Android多媒體之一內置Camera的使用

前言
這是一個介紹Android多媒體知識的系列博客。歡迎轉載,為尊重本人的勞動成果,轉載請注明出處:http://www.lxweimin.com/p/b8b3a94d2d0f
通過本系列博客可以學習到一下知識點:

內置Camera是基本每一款智能手機都自帶的內置系統應用,其內部提供了意圖過濾器:

<intent-filter>
    <action android:name="android.media.action.IMAGE_CAPTURE"/>
    <category android:name="android.intent.category.DEFAULT"/>
</intent-filter>

因此可以通過構造如下意圖進行調用
Intent i = new Intent("android.media.action.IMAGE_CAPTURE")
我們也可以通過MediaStore類的常量ACTION_IMAGE_CAPTURE來進行調用
Intent i = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
建議使用第二種方式,因為常量更利于未來的變化。
下面的代碼實現了調用camera獲取圖片并顯示在我們的應用里。

public class MainActivity extends AppCompatActivity {

    final static int CAMERA_RESULT = 0;
    ImageView img;
    String imageFilePath;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        Intent i = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
        startActivityForResult(i,CAMERA_RESULT);
    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);

        if(resultCode == RESULT_OK){
            Bundle extras = data.getExtras();
            Bitmap bitmap = (Bitmap) extras.get("data");
            img = (ImageView) findViewById(R.id.image);
            img.setImageBitmap(bitmap);
        }
    }
}

當運行這個示例的時候,你可能注意到顯示的圖像很小,因為Camera考慮到移動設備的內存較小,所以返回了一個很小的縮略圖。
可是在實踐開發中我們可能期望得到一個更大尺寸的圖片來滿足我們業務的需求,下面的代碼展示了如何獲取更大的圖片:
注意清單文件中加入讀寫外部存儲的權限

<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
public class MainActivity extends AppCompatActivity {

    final static int CAMERA_RESULT = 0;
    ImageView img;
    String imageFilePath;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        //指定存儲路徑為sd卡上,文件名為picture.jpg
        imageFilePath = Environment.getExternalStorageDirectory().getAbsolutePath()+"/picture.jpg";
        Log.v("imageFilePath",imageFilePath);
        Uri imageUri = Uri.fromFile(new File(imageFilePath));
        //或者 Uri imageUri = Uri.parse("file:///sdcard/picture.jpg") 在不同的機型上SD卡的路徑可能不一樣,因此不推薦此種寫法

        Intent i = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
        i.putExtra(MediaStore.EXTRA_OUTPUT,imageUri);//指定文件存儲位置
        startActivityForResult(i,CAMERA_RESULT);
    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);

        if(resultCode == RESULT_OK){
//            Bundle extras = data.getExtras();
//            Bitmap bitmap = (Bitmap) extras.get("data");
            img = (ImageView) findViewById(R.id.image);

            //獲取屏幕的寬高
            Display currentDisplay = getWindowManager().getDefaultDisplay();

            Point point = new Point();
            currentDisplay.getSize(point);

            //加載圖像的尺寸而不是圖像本身
            BitmapFactory.Options options = new BitmapFactory.Options();
            options.inJustDecodeBounds = true;
            Bitmap bitmap = BitmapFactory.decodeFile(imageFilePath,options);
            int widthRatio = (int) Math.ceil(options.outWidth/(float)point.x);
            int heightRatio = (int) Math.ceil(options.outHeight/(float)point.y);

            Log.v("HEIGHTRATIO",""+heightRatio);
            Log.v("WIDTHRATIO",""+widthRatio);

            //如果兩個比例都大于1,那么圖像的一條邊將大于屏幕
            if(heightRatio > 1 && widthRatio > 1){
                options.inSampleSize = Math.max(heightRatio,widthRatio);
            }

            //對它進行真正的解碼
            options.inJustDecodeBounds = false; // 此處為false,不只是解碼
            bitmap = BitmapFactory.decodeFile(imageFilePath,options);

            img.setImageBitmap(bitmap);
        }
    }
}
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容