美文网首页
Android多媒体之一内置Camera的使用

Android多媒体之一内置Camera的使用

作者: 会飞的大象 | 来源:发表于2016-06-02 11:13 被阅读655次

    前言
    这是一个介绍Android多媒体知识的系列博客。欢迎转载,为尊重本人的劳动成果,转载请注明出处:http://www.jianshu.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);
            }
        }
    }
    

    相关文章

      网友评论

          本文标题:Android多媒体之一内置Camera的使用

          本文链接:https://www.haomeiwen.com/subject/ddfkdttx.html