Prendre des photos avec l'appareil photo


Introduction à cette section

Cette section vous présente l'utilisation de l'appareil photo sous Android. Pour faire simple, il en existe deux types :

1. Appelez le système Apportez votre propre appareil photo pour prendre des photos, puis récupérez les photos après les avoir prises

2. Ou écrivez vous-même une page photo

Dans cette section, nous écrireons deux exemples simples à expérimenter les deux situations ci-dessus ~


1. Appelez le Carema intégré au système

Nous n'avons besoin que des mots suivants pour appeler la caméra système. Une fois que la caméra a pris une photo, elle le fera. renvoie une intention à onActivityResult. La partie supplémentaire de l'intention contient un Bitmap codé~

Intent it = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
startActivityForResult(it,Activity.DEFAULT_KEYS_DIALER);

//重写onActivityResult方法
    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        if(requestCode == Activity.RESULT_OK){
            Bundle bundle = data.getExtras();
            Bitmap bitmap = (Bitmap) bundle.get("data");
            img_show.setImageBitmap(bitmap);
        }
}

Rendu en cours d'exécution :

1.gif2.png

Cette qualité d'image AV floue ... Après tout, il s'agit d'un Bitmap codé. D'ailleurs, les photos prises ne seront pas enregistrées localement. Nous pouvons écrire notre propre code pour enregistrer l'image sur notre carte SD, puis l'afficher. Une telle image sera beaucoup plus claire. Eh bien, essayons en écrivant du code~

//定义一个保存图片的File变量
private File currentImageFile = null;

//在按钮点击事件处写上这些东西,这些是在SD卡创建图片文件的:
            @Override
            public void onClick(View v) {
                File dir = new File(Environment.getExternalStorageDirectory(),"pictures");
                if(dir.exists()){
                    dir.mkdirs();
                }
                currentImageFile = new File(dir,System.currentTimeMillis() + ".jpg");
                if(!currentImageFile.exists()){
                    try {
                        currentImageFile.createNewFile();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }

                Intent it = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
                it.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(currentImageFile));
                startActivityForResult(it, Activity.DEFAULT_KEYS_DIALER);
            }

//onActivityResult:
 @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        if (requestCode == Activity.DEFAULT_KEYS_DIALER) {
        img_show.setImageURI(Uri.fromFile(currentImageFile));
        }
}

D'accord, c'est très simple, jetons un œil aux résultats en cours d'exécution :

3.gif4.png5.png

C'est beaucoup plus clair que celui ci-dessus ~ C'est si simple d'appeler le Carema intégré au système ~


2. Écrivez une page photo par vous-même

Ici, nous devons utiliser un SurfaceView en avant-première L'interface est la même et très simple à utiliser !

Exécution des rendus :

6.gif

Implémentation du code :

Code de mise en page :activity_main.xml : une simple surfaceView + Button

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">

    <SurfaceView
        android:id="@+id/sfv_preview"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_weight="1" />

    <Button
        android:id="@+id/btn_take"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="调用系统照相机" /></LinearLayout>

MainActivity.java :

public class MainActivity extends AppCompatActivity {

    private SurfaceView sfv_preview;
    private Button btn_take;
    private Camera camera = null;
    private SurfaceHolder.Callback cpHolderCallback = new SurfaceHolder.Callback() {
        @Override
        public void surfaceCreated(SurfaceHolder holder) {
            startPreview();
        }

        @Override
        public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {

        }

        @Override
        public void surfaceDestroyed(SurfaceHolder holder) {
            stopPreview();
        }
    };

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        bindViews();
    }

    private void bindViews() {
        sfv_preview = (SurfaceView) findViewById(R.id.sfv_preview);
        btn_take = (Button) findViewById(R.id.btn_take);
        sfv_preview.getHolder().addCallback(cpHolderCallback);

        btn_take.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                camera.takePicture(null, null, new Camera.PictureCallback() {
                    @Override
                    public void onPictureTaken(byte[] data, Camera camera) {
                        String path = "";
                        if ((path = saveFile(data)) != null) {
                            Intent it = new Intent(MainActivity.this, PreviewActivity.class);
                            it.putExtra("path", path);
                            startActivity(it);
                        } else {
                            Toast.makeText(MainActivity.this, "保存照片失败", Toast.LENGTH_SHORT).show();
                        }
                    }
                });
            }
        });
    }

    //保存临时文件的方法
    private String saveFile(byte[] bytes){
        try {
            File file = File.createTempFile("img","");
            FileOutputStream fos = new FileOutputStream(file);
            fos.write(bytes);
            fos.flush();
            fos.close();
            return file.getAbsolutePath();
        } catch (IOException e) {
            e.printStackTrace();
        }
        return "";
    }


    //开始预览
    private void startPreview(){
        camera = Camera.open();
        try {
            camera.setPreviewDisplay(sfv_preview.getHolder());
            camera.setDisplayOrientation(90);   //让相机旋转90度
            camera.startPreview();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    //停止预览
    private void stopPreview() {
        camera.stopPreview();
        camera.release();
        camera = null;
    }

}

Enfin, il y a un autre PreviewActivity.java, où l'image sera C'est juste affiché sur l'interface~

/**
 * Created by Jay on 2015/11/22 0022.
 */
public class PreviewActivity extends AppCompatActivity {
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        ImageView img = new ImageView(this);
        String path = getIntent().getStringExtra("path");
        if(path != null){
            img.setImageURI(Uri.fromFile(new File(path)));
        }
        setContentView(img);
    }
}

Bon, c'est très simple n'oublie pas d'ajouter les permissions :


En plus, une chose à dire c'est que si carema n'est pas libéré, puis La prochaine fois que vous appellerez carema, aucune erreur ne sera signalée. Le contenu de l'erreur est : java.lang.RuntimeException : échec de la connexion au service de caméra Par conséquent, vous devez release() Carema ; si vous continuez à signaler l'erreur ci-dessus, veuillez redémarrer votre téléphone~


3. Téléchargez l'exemple de code dans cette section

. CaremaDemo1.zip

CaremaDemo2.zip


Résumé de cette section

D'accord, cette section explique comment appeler la caméra intégrée du système pour prendre les photos et comment écrire Carema vous-même. Complétez l'appareil photo personnalisé, hé, dans certains cas on n'a pas besoin de l'interface de prévisualisation des photos, on crée directement une boîte flottante, Cliquez ensuite sur la case flottante pour déclencher l'événement photo. Cela ne vous permettrait-il pas de prendre des photos sans que personne ne s'en aperçoive ? (Photo furtive) Hé, 7.jpg C'est intéressant, je veux écrire le code moi-même~