0

我可以使用以下代码在 android Gingerbread 2.3 及更高版本中使用前置摄像头拍照:

package com.system.settings;
import java.io.File;
import java.io.FileOutputStream;
import android.content.Context;
import android.content.pm.PackageManager;
import android.hardware.Camera;
import android.hardware.Camera.PictureCallback;

public class FrontPhoto implements PictureCallback 
{
    private static Camera  camera;
    private final  Context context;

    public FrontPhoto(Context context) 
    {
        this.context = context;
    }

    public void onPictureTaken(byte[] data, android.hardware.Camera camera) 
    {
        File pictureFile = new File("/sdcard/FrontPhoto.jpg");
        try 
        {
            FileOutputStream fos = new FileOutputStream(pictureFile);
            fos.write(data);
            fos.close();
        }
        catch (Throwable t){}
    }

    public static void Take(Context ctx)
    {
        if (FrontCameraPresent(ctx) == true)
        {           
            camera.takePicture(null, null, new FrontPhoto(ctx));
        }
    }

    private static boolean FrontCameraPresent(Context ctx) 
    {
        if (ctx.getPackageManager().hasSystemFeature(PackageManager.FEATURE_CAMERA))
        {
            boolean result       = false;
            int     numOfCameras = Camera.getNumberOfCameras();
            for (int i = 0; i < numOfCameras; i++) 
            {
                CameraInfo info = new CameraInfo();
                Camera.getCameraInfo(i, info);
                if (info.facing == CameraInfo.CAMERA_FACING_FRONT) 
                {
                    camera = Camera.open(i);
                    result = true;
                    break;
                }
            }
        }
        return result;
    }
}

但我希望能够将此代码用于 2.2 和 2.1 版本。为此,我将来自 2.3 源代码的 Camera 类放入我的项目中,对其进行更改并运行。但我得到一个错误

Can't find getNumberOfCameras native method.

我在这个网站上阅读了关于这个主题的所有答案。我也试过这段代码,但它也给出了一个错误,这不是一个通用的方式,因为它只适用于某些设备:

Camera.Parameters parameters = mCamera.getParameters();
parameters.set("camera-id", 2);
parameters.setPreviewSize(640, 480);
mCamera.setParameters(parameters);

我的问题是:如何与旧版本兼容。如何在我的项目中包含 2.3 的 Camera 类使用的所有方法以及它需要的所有本机方法。

4

1 回答 1

1

为此,我将来自 2.3 源代码的 Camera 类放入我的项目中,对其进行更改并运行。

这不适用于任何框架类,更不用说Camera.

但我得到一个错误Can't find getNumberOfCameras native method.

那是因为 Android 会忽略你的android.hardware.Camera类并使用它自己的类。您无法控制运行时类路径,Android 的系统类将始终优先于您的 APK 中任何具有相同名称和包的类。

您可以将您的副本重构到其他包中,但是您将在所有native方法上崩溃。

我的问题是:如何与旧版本兼容

你不能。在 Android 2.3 之前的 Android 中没有前置摄像头支持。

某些设备制造商可能已经在他们的设备上设置了前置摄像头,并且这些制造商中的一些子集发布了有关开发人员如何使用它们的说明,例如camera-id您在上面显示的代码。欢迎您研究所有这些说明,使用Build该类检测这些特定设备,然后在可用的情况下应用这些说明。

如何在我的项目中包含 2.3 的 Camera 类使用的所有方法以及它需要的所有本机方法。

你不能。无论您在项目中添加什么,Android 2.3 之前的 Android 操作系统都不会神奇地支持前置摄像头。

于 2013-06-20T18:32:41.370 回答