3

Android アプリケーションでカメラを使用する方法を学習しようとしています。私は現在、ボタンを重ねた作業中のプレビューを持っています。写真を正常に撮影できるように設定しましたが、写真を SD カードに保存しようとすると、正しく動作しません。必ず「保存中のエラー」が返ってきます。

私はそれが私の SD カードではないことを知っており、別のアプリで以前とほぼ同じコードを使用してビットマップを保存しましたが、これは正常に機能しました。

また、アクティビティの ImageView に写真を配置してテストしたため、写真が正常に撮影されていることもわかっています。

なぜこれが機能しないのかわかりません。

Button takePhoto = (Button)findViewById(R.id.takephoto);
    takePhoto.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View arg0) {



            mCamera.takePicture(shutterCallback, rawCallback,
                    jpegCallback);




        }
    });




}


ShutterCallback shutterCallback = new ShutterCallback() {
    public void onShutter() {

    }
};

/** Handles data for raw picture */
PictureCallback rawCallback = new PictureCallback() {
    public void onPictureTaken(byte[] arg0, Camera camera) {



    }
};

/** Handles data for jpeg picture */
PictureCallback jpegCallback = new PictureCallback() {
    public void onPictureTaken(byte[] arg0, Camera camera) {

        Bitmap photo = BitmapFactory.decodeByteArray(arg0, 0, arg0.length);

        tempSavePhoto(photo);

        switchToPolaroidView();

    }
};



public void tempSavePhoto(Bitmap photo){

    File root = new File(Environment.getExternalStorageDirectory() + File.separator + "Photos");
    File image = new File(root, "toSend.jpg");
    sendBroadcast(new Intent(Intent.ACTION_MEDIA_MOUNTED, Uri.parse("file://"+ Environment.getExternalStorageDirectory())));

    boolean success = false;

    FileOutputStream outStream;
    try {

        outStream = new FileOutputStream(image);
        photo.compress(Bitmap.CompressFormat.PNG, 100, outStream); 
        /* 100 to keep full quality of the image */

        outStream.flush();
        outStream.close();
        success = true;
    } catch (FileNotFoundException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }

    if (success) {
        Toast.makeText(getApplicationContext(), "Saved successfully",
                Toast.LENGTH_SHORT).show();
    } else {
        Toast.makeText(getApplicationContext(),
                "Error during image saving", Toast.LENGTH_SHORT).show();
    }
}
4

2 に答える 2

1

これをマニフェストに追加します

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

このアプリには、他のアプリとは異なり、SDCard に保存する権限がない可能性があります。これを追加すると権限が付与されます

于 2012-07-06T20:58:16.797 に答える
1

私は別のアプローチを試みましたが、うまくいきました。もう一方が機能しなかった理由はわかりませんが、写真は正常に保存されています。代わりに使用したものは次のとおりです。

public void tempSavePhoto(Bitmap photo){

    ByteArrayOutputStream bytes = new ByteArrayOutputStream();
    photo.compress(Bitmap.CompressFormat.JPEG, 40, bytes);


    File f = new File(Environment.getExternalStorageDirectory()
                            + File.separator + "test.jpg");
    try {
        f.createNewFile();
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

    FileOutputStream fo = null;
    try {
        fo = new FileOutputStream(f);
    } catch (FileNotFoundException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
    try {
        fo.write(bytes.toByteArray());
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

    sendBroadcast(new Intent(Intent.ACTION_MEDIA_MOUNTED, Uri.parse("file://"+ Environment.getExternalStorageDirectory())));


}

私はこの投稿からこのアイデアを得て、私を助けた答えに投票したことに注意してください。

于 2012-07-06T23:01:28.820 に答える