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 OS では、プロジェクトに何を入れても、前面カメラのサポートが魔法のように芽生えることはありません。

于 2013-06-20T18:32:41.370 に答える