Android开发以比较少见的方式调用系统自带的照相机

要实现的目标:

自己写的APP,需要调用Android数码相机,连续拍几张照片,然后取得这些照片。

遇到的问题:

如果按常规的方法调用,就会出现

“拍一张照片后,让APP自己去取得这张照片,并自己处理保存”,即便通过使用

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

也会遇到,拍一张照片后,摄像头缩回去,貌似只要相机的onpause事件,就会缩回镜头。然后让用户先把是否保存。由于用的”Intent.FLAG_ACTIVITY_NEW_TASK“,所以,相机还会在前台运行着,用户可以继续拍照,但第一张照片,没有保存(因为,我们的APP,并没有专门去取得照片和处理保存)。

实际上,我们想实现的就是,在我们的应用里,直接启动(而非通常说的 ”调用“)系统相机,让用户可以像平常手工启动相机一样,可以不受干扰的连续拍多张照片。

并手工去切换/回到,我们的APP,然后在APP的oncreate或onresume事件里,对刚才拍的那些照片进行处理。

于是,最后通过使用系统相机的包名,来实现在我们的APP里启动相机。

PackageManager packageManager = getPackageManager();
                Intent intent = new Intent();
                //intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
                intent.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);
                //intent.addFlags(Intent.FLAG_ACTIVITY_BROUGHT_TO_FRONT);
                intent = packageManager
                        .getLaunchIntentForPackage(“com.huawei.camera”);
                /** packageName指的就要启动应用的包名 */
                if (intent == null) {
                    System.out.println(“APP not found!”);
                }
                startActivity(intent);
            }
不过,由于不同手机或是Android系统的智能相机的照相机app的包名不同,于是,又写了以下代码(纯测试用,所以,有些乱)来获取这个设备的相机的准确包名:
                List<PackageInfo> lpi=GenUtils.getAllApps(MainActivity.this);
String a=””;
for(PackageInfo pi:lpi)
{
    if(pi.packageName.contains(“camera”))
    a+=pi.packageName+”#”;
    }
AlertDialog.Builder builder = new AlertDialog.Builder(
        MainActivity.this);
builder.setTitle(“提示”);
builder.setMessage(a);
builder.setPositiveButton(“确定”,
        new DialogInterface.OnClickListener() {
            public void onClick(DialogInterface dialog,
                    int whichButton) {
            }
        });
builder.show();
一点小记录:
Galaxy 的照片机包名为
com.sec.android.app.camera
华为平板的相机包名为
com.huawei.camera
com.huawei.cameracover
另外,找到一个探讨小算法的文章,分享一下
两个list 取不同
高效的找出两个List中的不同元素
博客园的文章,还是一如继往的有料。