web-dev-qa-db-ja.com

プログラムでAndroidのカメラで写真を撮る

ボタンを持つアプリを作成し、そのボタンのonClickListenerを作成しました。私はいくつかのサンプルコード例を試しましたが、どれも機能しませんでした。それらはすべてAndroidカメラアプリを起動し、写真を撮りません。画面上のボタンを押すと写真が撮られるように、onClickListenerに配置できるコードが必要です。

Androidアクティビティでボタンを押したときにカメラで写真を撮らせるにはどうすればよいですか?

56
Kevik

次のデモコードをご覧ください。

UIのXMLファイルは次のとおりです。

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
    Android:layout_width="fill_parent"
    Android:layout_height="fill_parent"
    Android:orientation="vertical" >

    <Button
        Android:id="@+id/btnCapture"
        Android:layout_width="wrap_content"
        Android:layout_height="wrap_content"
        Android:text="Camera" />

</LinearLayout>

そして、これはJavaクラスファイルです。

public class CameraDemoActivity extends Activity {
    int TAKE_PHOTO_CODE = 0;
    public static int count = 0;

    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        // Here, we are making a folder named picFolder to store
        // pics taken by the camera using this application.
        final String dir = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES) + "/picFolder/";
        File newdir = new File(dir);
        newdir.mkdirs();

        Button capture = (Button) findViewById(R.id.btnCapture);
        capture.setOnClickListener(new View.OnClickListener() {
            public void onClick(View v) {

                // Here, the counter will be incremented each time, and the
                // picture taken by camera will be stored as 1.jpg,2.jpg
                // and likewise.
                count++;
                String file = dir+count+".jpg";
                File newfile = new File(file);
                try {
                    newfile.createNewFile();
                }
                catch (IOException e)
                {
                }

                Uri outputFileUri = Uri.fromFile(newfile);

                Intent cameraIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
                cameraIntent.putExtra(MediaStore.EXTRA_OUTPUT, outputFileUri);

                startActivityForResult(cameraIntent, TAKE_PHOTO_CODE);
            }
        });
    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);

        if (requestCode == TAKE_PHOTO_CODE && resultCode == RESULT_OK) {
            Log.d("CameraDemo", "Pic saved");
        }
    }
}

注:

マニフェストファイルで次のアクセス許可を指定します。

<uses-permission Android:name="Android.permission.CAMERA"/>

<uses-permission Android:name="Android.permission.WRITE_EXTERNAL_STORAGE"/>
97
Mehul Joisar

写真を撮るには2つの方法があります。

1-インテントを使用して写真を作成する

2-カメラAPIを使用する

2番目の方法を使用する必要があり、そのうち2つについて ここにサンプルコード があると思います。

29
hm1984ir

Magical Take Photoライブラリを使用できます。

1。gradleでコンパイルしてみてください

compile 'com.frosquivel:magicaltakephoto:1.0'

2。manifest.xmlでこの権限が必要です

<uses-permission Android:name="Android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission Android:name="Android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission Android:name="Android.permission.CAMERA"/>

。このようなクラスのインスタンス

//「this」は現在のアクティビティパラメータです

MagicalTakePhoto magicalTakePhoto =  new MagicalTakePhoto(this,ANY_INTEGER_0_TO_4000_FOR_QUALITY);

4。写真を撮る必要がある場合は、メソッドを使用します

magicalTakePhoto.takePhoto("my_photo_name");

5。デバイスで画像を選択する必要がある場合は、次の方法を試してください:

magicalTakePhoto.selectedPicture("my_header_name");

6。アクティビティまたはフラグメントのメソッドonActivityResultを次のようにオーバーライドする必要があります:

@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
     super.onActivityResult(requestCode, resultCode, data);
     magicalTakePhoto.resultPhoto(requestCode, resultCode, data);

     // example to get photo
     // imageView.setImageBitmap(magicalTakePhoto.getMyPhoto());
}

注:このライブラリでのみ、デバイスで写真を撮影して選択できます。これには最小API 15が使用されます。

5
fabian7593

画像を取得して目的のフォルダに保存します

 //Global Variables
   private static final int CAMERA_IMAGE_REQUEST = 101;
    private String imageName;

撮影機能

 public void captureImage() {

            // Creating folders for Image
            String imageFolderPath = Environment.getExternalStorageDirectory().toString()
                    + "/AutoFare";
            File imagesFolder = new File(imageFolderPath);
            imagesFolder.mkdirs();

            // Generating file name
            imageName = new Date().toString() + ".png";

            // Creating image here
            Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
            takePictureIntent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(new File(imageFolderPath, imageName)));
            startActivityForResult(takePictureIntent,
                    CAMERA_IMAGE_REQUEST);

        }

そうでなければ追加された新しい画像をブロードキャスト画像は画像ギャラリーに表示されません

    public void onActivityResult(int requestCode, int resultCode, Intent data) {
                // TODO Auto-generated method stub
                super.onActivityResult(requestCode, resultCode, data);

                if (resultCode == Activity.RESULT_OK && requestCode == CAMERA_IMAGE_REQUEST) {

                    Toast.makeText(getActivity(), "Success",
                            Toast.LENGTH_SHORT).show();

 //Scan new image added
                    MediaScannerConnection.scanFile(getActivity(), new String[]{new File(Environment.getExternalStorageDirectory()
                            + "/AutoFare/" + imageName).getPath()}, new String[]{"image/png"}, null);


 // Work in few phones
                    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KitKat) {

                        getActivity().sendBroadcast(new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE, Uri.parse(Environment.getExternalStorageDirectory()
                                + "/AutoFare/" + imageName)));

                    } else {
                        getActivity().sendBroadcast(new Intent(Intent.ACTION_MEDIA_MOUNTED, Uri.parse(Environment.getExternalStorageDirectory()
                                + "/AutoFare/" + imageName)));
                    }
                } else {
                    Toast.makeText(getActivity(), "Take Picture Failed or canceled",
                            Toast.LENGTH_SHORT).show();
                }
            }

許可

    <uses-permission Android:name="Android.permission.CAMERA" />
    <uses-feature Android:name="Android.hardware.camera" />
    <uses-permission Android:name="Android.permission.WRITE_EXTERNAL_STORAGE" />
2
Hitesh Sahu

AndroidのCameraとCamera2 APIの両方を使用してプログラムで写真/写真を撮る方法を探している人は、Googleが提供するオープンソースのサンプルをご覧ください here

2
Phileo99