Ambil gambar menggunakan Kamera


Pengenalan kepada bahagian ini

Bahagian ini membawakan anda penggunaan Kamera dalam Android Secara ringkasnya, ia adalah mengambil gambar:

1. Panggil sistem Bawa kamera anda sendiri untuk mengambil gambar, dan kemudian dapatkan gambar selepas mengambilnya

2. Atau tulis sendiri halaman foto

Dalam bahagian ini kami akan menulis dua contoh mudah untuk dialami dua situasi di atas~


1 Panggil Carema terbina dalam sistem

Kami hanya memerlukan perkataan berikut untuk memanggil kamera sistem, ia akan kembalikan niat kepada onActivityResult. Bahagian tambahan niat mengandungi Peta Bit yang dikodkan~

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);
        }
}

Penyampaian berjalan:

1.gif2.png

Kualiti Imej AV yang kabur ini ... Lagipun, ia adalah Bitmap yang dikodkan, gambar yang diambil tidak akan disimpan secara tempatan. Kami boleh menulis kod kami sendiri untuk menyimpan gambar ke kad SD kami dan kemudian memaparkannya gambar sedemikian akan menjadi lebih jelas. Baiklah, mari cuba dengan menulis kod~

//定义一个保存图片的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));
        }
}

Baiklah, ia sangat mudah, mari kita lihat hasil yang sedang dijalankan:

3.gif4.png5.png

Ia jauh lebih jelas daripada yang di atas~ Sangat mudah untuk memanggil Carema terbina dalam sistem~


2. Tulis halaman foto sendiri

Di sini kita perlu menggunakan a SurfaceView sebagai pratonton kami Antara muka adalah sama dan sangat mudah untuk digunakan!

Menjalankan pemaparan:

6.gif

Pelaksanaan kod:

Kod reka letak:activity_main.xml: surfaceView + Button yang ringkas

<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;
    }

}

Akhir sekali terdapat satu lagi PreviewActivity.java, di mana gambar akan berada Ia hanya dipaparkan pada antara muka~

/**
 * 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);
    }
}

Nah, ia sangat mudah untuk menambah kebenaran:


Selain itu, satu perkara yang perlu dikatakan ialah jika carema tidak dikeluarkan, maka Kali seterusnya anda menghubungi carema, tiada ralat akan dilaporkan. Kandungan ralat ialah: java.lang.RuntimeException:gagal menyambung ke perkhidmatan kamera Oleh itu, anda perlu melepaskan() Carema; jika anda terus melaporkan ralat di atas, sila mulakan semula telefon anda~


3 Muat turun kod contoh di bahagian ini

CaremaDemo1.zip

CaremaDemo2.zip


Ringkasan bahagian ini

Baiklah, bahagian ini menerangkan cara memanggil kamera terbina dalam sistem untuk mendapatkan gambar yang diambil, dan cara menulis Carema sendiri. Lengkapkan kamera tersuai, hehe, dalam beberapa kes kami tidak memerlukan antara muka pratonton foto, kami terus membuat kotak terapung, Kemudian klik pada kotak terapung untuk mencetuskan acara foto. Bukankah ini membolehkan anda mengambil gambar tanpa disedari oleh sesiapa? (Foto curi) Hei, 7.jpg Menariknya, saya mahu menulis kod itu sendiri~