0

カメラ機能をベースにしたAndroidアプリを開発しています。プログラムに問題があり、それを理解できません。MymCurrentImagePathは初期化されているため、常に null です。logcat は、takepicture()関数にヒットしないことを示しているため、値が与えられることはありません。カメラが画像をうまく保存するまでビットマップへの後の操作を待つことができるように、スレッドをスリープさせようとしましたが、まだ機能していません。しかし、撮った写真を読まなくても、アプリケーションは完璧に動作し、写真をうまく保存できます。メタデータを直接操作するためにも使用しようとしbitmapfactory.decodebyte()ましたが、これも失敗しました。誰が私が間違っていた部分について何か考えを教えてくれますか? それは本当に役に立ちます。どうもありがとうございました!!!

private static final String IMAGE_DIRECTORY ="sdcard/DCIM/Camera";
public static String mCurrentImagePath = null;
private CameraView cv;
private Camera mCamera = null;

public Camera.PictureCallback pictureCallback = new Camera.PictureCallback() {

    public void onPictureTaken(byte[] data, Camera camera) {

        try{
            isFinish = false;
            long timeTaken = System.currentTimeMillis();
            mCurrentImagePath = IMAGE_DIRECTORY + "/"+ createName(timeTaken) + ".jpg";
            File file = new File(mCurrentImagePath);
            Log.d("path", "mCurrentImagePath_takepicture = " + mCurrentImagePath);
            FileOutputStream fos = new FileOutputStream(file);
            fos.write(data);
            fos.flush();
            fos.close();
            Toast.makeText(OpenASURF.this, "saving the picture", Toast.LENGTH_SHORT).show();
            isFinish = true;
        }
        catch(IOException e) {
            e.printStackTrace();
        }
        mCamera.startPreview();
        // TODO Auto-generated method stub
    }
}; 

cv.setOnClickListener(new View.OnClickListener() {
    public void onClick(View v) {
        if(mCamera != null) {
            mCamera.takePicture(null, null, pictureCallback);
            // let the system wait until finish taking the pictures.
            //while(isFinish == false) {
            try {
                Thread.sleep(20000);
            } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            //}
            Log.d("path", "mCurrentImagePath_over1 = " + mCurrentImagePath);
            Bitmap bmp = null;

            bmp = BitmapFactory.decodeFile(mCurrentImagePath);
            Log.d("path", "mCurrentImagePath_over2 = " + mCurrentImagePath);
        }
4

2 に答える 2

1

正しいIMAGE_DIRECTORYですか?私はそれが/sdcard/DCIM/Camera、開始スラッシュであると予想しています。

さらに良いのは、画像パスを正しい方法で取得することです: DIRECTORY_PICTURES

File path = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES);
File file = new File(path, "DemoPicture.jpg");
于 2012-09-18T20:51:27.147 に答える
1

の後にどれだけ待ってもtakePicture()onPictureTaken()コールバックは戻った後にのみ呼び出されOnClick()ます。それらはすべてアプリのメイン スレッドを使用します。

あなたは呼び出すことができます

BitmapFactory.decodeFile(mCurrentImagePath);

onPictureTaken()、または からアクティビティにイベントを投稿できonPictureTaken()ます。

于 2012-09-19T07:07:42.757 に答える