Android相机基础介绍

我们对摄像头的使用如今已经是比较频繁的啦,在二维码,拍照,扫描中都起着巨大的作用。我们通常有两种方式,一是调用系统的相机或者具有拍照功能的应用,二是自定义相机。

1、调用系统相机

我们调用系统相机一般有两种做法,一个是可以在Intent中直接指定另一个程序的包名和它的MainActivity,那么我们就可以直接启动这个应用,当然前提是知道程序的完整包名和它的启动Activity。

如果你的移动设备确认连接在了电脑上,那么我们可以用一条ADB命令来获得设备上的所有应用的包名,我们只要从中找下是那个就可以了,一般是很容易辨别的。

adb shell pm list packages -s

有对adb命令感兴趣的朋友可以看我的博客Android App压力测试(Monkey和ADB)

在我的Genymotion上系统相机的包名是com.android.camera2,我们可以通过如下方式启动:

Intent intent = new Intent(Intent.ACTION_MAIN);  
intent.addCategory(Intent.CATEGORY_LAUNCHER);              
ComponentName cn = new ComponentName(packageName, className);              
intent.setComponent(cn);  
startActivity(intent);  

但大部分情况下我们只能知道包名却不能知道MainActivity的类名,所以我们可以采用另一种写法:

public void start(View view) {
    Intent intent = this.getPackageManager().getLaunchIntentForPackage("com.android.camera2");
    startActivity(intent);
}

这样就可以很轻松地调用系统相机了。

第二种调用系统相机的就是使用隐式Intent:

Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
startActivity(intent);

这里要注意的是因为我们是直接在自己写的程序中使用了系统相机,并不是像第一种调用其它应用,所以我们是需要给我们的app添加相机权限的,大家可以在调用相机后看看后台,会发现运行的程序只有我们这个。

了解隐式Intent的朋友应该知道ACTION_IMAGE_CAPTURE这样一个action,在系统相机manifest里面肯定会有一个过滤器去筛选这个action,同样如果我们想要我们的应用也可以被其它应用调用,我们也可以在manifest中设置一个过滤器。

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

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

这样在你调用android.media.action.IMAGE_CAPTURE这个action时,我们的程序也会被检测到。

2、图片显示

调用了系统相机是可以进行拍照,但照片是存在系统服务里,我们如何在自己的应用里看到图片是现在要说明的。

我们可以用startActivityForResult()方法来获得我们拍照的图片,我们在button下面添加一个ImageVIew用来显示我们得到的图片。

public class TestActivity extends AppCompatActivity {
   

    private static final int REQUEST_1 = 1;
    private ImageView mImageView;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_test);
        mImageView = (ImageView) findViewById(R.id.iv);
    }

    public void start(View view) {
        Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
        startActivityForResult(intent, REQUEST_1);
    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        if (resultCode == RESULT_OK) {
            if (requestCode == REQUEST_1) {
                Bundle bundle = data.getExtras();
                Bitmap bitmap = (Bitmap) bundle.get(
  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值