如何有目的地推出前置摄像头?

时间:2012-03-13 14:37:22

标签: android android-camera

我正在使用本机应用程序打开相机的意图:

    Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);

    Uri photoUri = Uri.fromFile(getOutputPhotoFile());
    intent.putExtra(MediaStore.EXTRA_OUTPUT, photoUri);

    startActivityForResult(intent, CAMERA_PHOTO_REQUEST_CODE);

每次打开的相机(前/后相机)都像上次打开本机相机应用程序一样。这意味着如果我最后一次关闭本机相机应用程序时后置摄像头处于活动状态,那么当我启动相机的意图时,后置摄像头将处于活动状态。

我想直接启动前置摄像头。有人知道怎么做吗?

8 个答案:

答案 0 :(得分:34)

提醒:这是一个黑客

将此添加到意图

intent.putExtra("android.intent.extras.CAMERA_FACING", 1);

此解决方案不可持续,它使用相机应用程序的测试代码。有关更多信息,请查看AOSP Camera项目的Util类中的“getCameraFacingIntentExtras”静态方法。

<强>更新 看起来它在L

中被禁用了

答案 1 :(得分:8)

取自Google相机的Android 7.1快捷方式(但应与较旧的Androids配合使用)

intent.putExtra("android.intent.extra.USE_FRONT_CAMERA", true);

因此,结合之前的答案,这对我来说可以在我可以测试的所有手机上使用

intent.putExtra("android.intent.extras.CAMERA_FACING", android.hardware.Camera.CameraInfo.CAMERA_FACING_FRONT);
intent.putExtra("android.intent.extras.LENS_FACING_FRONT", 1);
intent.putExtra("android.intent.extra.USE_FRONT_CAMERA", true);

答案 2 :(得分:3)

没有专门针对前置摄像头的意图(AFAIK)。

以编程方式执行此操作:Android SDK&lt; = 2.2仅支持使用单个摄像头(第一个后置摄像头)。对于2.3+,您可以通过摄像机循环并找出哪个是前置摄像头(如果可用)。它就像是......

Camera cam = null;
Camera.CameraInfo cameraInfo = new Camera.CameraInfo();
for (int camNo = 0; camNo < Camera.getNumberOfCameras(); camNo++) {
    CameraInfo camInfo = new CameraInfo();
    Camera.getCameraInfo(camNo, camInfo);
    if (camInfo.facing.equals(Camera.CameraInfo.CAMERA_FACING_FRONT)) {
        cam = Camera.open(camNo);
    }
}
if (cam == null) {
   // no front-facing camera, use the first back-facing camera instead.
   // you may instead wish to inform the user of an error here...
   cam = Camera.open();
}
// ... do stuff with Camera cam ...

此示例仅为骨架,不提供任何(非常需要的)错误处理。

编辑:您还需要将这些添加到您的清单中:

<uses-permission android:name="android.permission.CAMERA" />
<uses-feature android:name="android.hardware.camera" android:required="false" />
<uses-feature android:name="android.hardware.camera.front" android:required="false" />

答案 3 :(得分:3)

经过对华为和三星相机的一些逆向工程,以下代码适用于对我来说很重要的大多数设备:

Intent(MediaStore.ACTION_IMAGE_CAPTURE).apply {
    putExtra(MediaStore.EXTRA_OUTPUT, photoUri)

    putExtra("com.google.assistant.extra.USE_FRONT_CAMERA", true)
    putExtra("android.intent.extra.USE_FRONT_CAMERA", true)
    putExtra("android.intent.extras.LENS_FACING_FRONT", 1)
    putExtra("android.intent.extras.CAMERA_FACING", 1)

    // Samsung
    putExtra("camerafacing", "front")
    putExtra("previous_mode", "front")

    // Huawei
    putExtra("default_camera", "1")
    putExtra("default_mode", "com.huawei.camera2.mode.photo.PhotoMode")
}

答案 4 :(得分:1)

以下代码将在 Android 11 之前有效,包括 Samsung 电话

fun updateIntentForCameraFacing(cameraIntent: Intent, frontFacing: Boolean){
    if(Build.VERSION.SDK_INT < Build.VERSION_CODES.O){
        if(frontFacing)
            cameraIntent.putExtra("android.intent.extras.CAMERA_FACING", CameraCharacteristics.LENS_FACING_BACK)
        else
            cameraIntent.putExtra("android.intent.extras.CAMERA_FACING", CameraCharacteristics.LENS_FACING_FRONT)

    }
    else if(frontFacing){
        cameraIntent.putExtra("android.intent.extras.CAMERA_FACING", CameraCharacteristics.LENS_FACING_BACK)
        cameraIntent.putExtra("android.intent.extra.USE_FRONT_CAMERA", true)

        //samsung
        cameraIntent.putExtra("camerafacing", "front")
        cameraIntent.putExtra("previous_mode", "front")
    }
    else{
        cameraIntent.putExtra("android.intent.extras.CAMERA_FACING", CameraCharacteristics.LENS_FACING_FRONT)
        cameraIntent.putExtra("android.intent.extra.USE_FRONT_CAMERA", false)

        //samsung
        cameraIntent.putExtra("camerafacing", "rear")
        cameraIntent.putExtra("previous_mode", "rear")
    }
}

答案 5 :(得分:0)

试试这个:

df3 = pd.merge(df2, df1.drop('Country', axis=1), on=['Date','Campaign','Banner'], how='left')
df4 = pd.merge(df2, df1, on=['Date','Banner'], how='left')

print (df3)
    Banner   Campaign Country       Date  Value_2 id_campaign  Value_1
0  banner1  campaign1       de  1/1/2016        5        none     10.0
1  banner2  campaign2       it  2/1/2016       10        none      5.0
2  banner3       none       de  1/1/2016       15       12345      NaN
3  banner4  campaign4       en  3/1/2016       20        none      NaN
4  banner5  campaign5       en  4/1/2016       25        none      NaN

print (df4['Value_1'])
0    10.0
1     5.0
2    20.0
3     NaN
4     NaN
Name: Value_1, dtype: float64

df3['Value_1'] = df3['Value_1'].combine_first(df4['Value_1']).fillna(0).astype(int)
print (df3)
    Banner   Campaign Country       Date  Value_2 id_campaign  Value_1
0  banner1  campaign1       de  1/1/2016        5        none       10
1  banner2  campaign2       it  2/1/2016       10        none        5
2  banner3       none       de  1/1/2016       15       12345       20
3  banner4  campaign4       en  3/1/2016       20        none        0
4  banner5  campaign5       en  4/1/2016       25        none        0

答案 6 :(得分:0)

    pictureIntent.putExtra("android.intent.extra.USE_FRONT_CAMERA", true);
    pictureIntent.putExtra("android.intent.extras.LENS_FACING_FRONT", 1);
    pictureIntent.putExtra("android.intent.extras.CAMERA_FACING", 1);
working on intex 

答案 7 :(得分:-1)

在您的原生相机应用程序中切换到前置摄像头时,您是否尝试过观看adb logcat?如果它确实是另一个活动,那么它将在那里显示,你可以简单地将意图复制到你的应用程序。如果它没有出现,我猜你是运气不好。