openGL相機

activity中


import androidx.appcompat.app.AppCompatActivity;

import android.Manifest;
import android.graphics.SurfaceTexture;
import android.os.Build;
import android.os.Bundle;
import android.view.TextureView;
import android.view.View;

public class MainActivity extends AppCompatActivity implements TextureView.SurfaceTextureListener{

    TextureView textureView;
    private CamearInterface camear;
    @Override
    protected void onCreate(Bundle savedInstanceState){
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        textureView=findViewById(R.id.textid);
        textureView.setSurfaceTextureListener(this);
        //權限
        if (Build.VERSION.SDK_INT>=Build.VERSION_CODES.M){
            requestPermissions(new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE,Manifest.permission.READ_EXTERNAL_STORAGE
                    ,Manifest.permission.CAMERA,Manifest.permission.RECORD_AUDIO},100);
        }
        //多態
        camear=new MyCamera3(this);

    }

    public void click(View view){
        camear.closeCamera();
    }

    @Override
    public void onSurfaceTextureAvailable(SurfaceTexture surface, int width, int height) {
        camear.openCanera(surface);
    }

    @Override
    public void onSurfaceTextureSizeChanged(SurfaceTexture surface, int width, int height) {

    }

    @Override
    public boolean onSurfaceTextureDestroyed(SurfaceTexture surface) {
        return false;
    }

    @Override
    public void onSurfaceTextureUpdated(SurfaceTexture surface) {

    }
}

需要一個接口

import android.graphics.SurfaceTexture;

public interface CamearInterface {
    public void openCanera(SurfaceTexture texture);
    public void closeCamera();
}

另一個類

package com.example.cameraapp;

import android.content.Context;
import android.graphics.SurfaceTexture;
import android.hardware.Camera;

import java.io.IOException;
import java.util.List;

public class MyCamear implements CamearInterface{
    private Context context;
    private Camera mcamera;

    public MyCamear(Context context) {
        this.context = context;
    }

    @Override
    public void openCanera(SurfaceTexture texture){
        if (mcamera!=null){
            closeCamera();
        }
        mcamera=Camera.open(0);
        Camera.Parameters parameters = mcamera.getParameters();
        List<Camera.Size> supportedPictureSizes = parameters.getSupportedPictureSizes();
        Camera.Size bestPreSie = getBestPreSie(supportedPictureSizes);
        parameters.setPictureSize(bestPreSie.width,bestPreSie.height);
        mcamera.setParameters(parameters);
        try {
            mcamera.setPreviewTexture(texture);
        } catch (IOException e) {
            e.printStackTrace();
        }
        mcamera.cancelAutoFocus();
        mcamera.startPreview();
    }

    @Override
    public void closeCamera() {

        mcamera.startPreview();
        mcamera.release();
        mcamera=null;
    }
    public Camera.Size getBestPreSie(List<Camera.Size>sizes){
        int x=0;
        float rate=1280.0f/720.0f;
        for (int i = sizes.size()-1; i >=0 ; i--) {
            Camera.Size size = sizes.get(i);
            if (size.width>=720&&size.height>=720){
                if (Math.max(size.width,size.height)*1.0f/Math.min(size.width,size.height)==rate){
                  x=i;
                  break;
                }
            }
        }
        return sizes.get(x);
    }
}

這個是舊的Camera

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章