简体   繁体   English

onPreviewCallback不会启动android studio

[英]onPreviewCallback wont start android studio

I want to call onPreviewCallback in my app but it wont start. 我想在我的应用程序中调用onPreviewCallback,但是它无法启动。 For now there is nothing useufull on onPreviewCallback, i just want it to work. 目前,onPreviewCallback上没有任何用处,我只是希望它能工作。 I tried to put callback in Camerapreview.java and still nothing. 我试图在Camerapreview.java中放置回调,但仍然没有。 Can anyone tell me where i made my mistake? 谁能告诉我我在哪里犯错了? Here is my code: activity_main.xml 这是我的代码:activity_main.xml

<?xml version="1.0" encoding="utf-8"?>

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context="com.example.nikola.camera.MainActivity">

    <FrameLayout
        android:id="@+id/camera_preview"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        />
</RelativeLayout>

MainActivity.java MainActivity.java

package com.example.nikola.camera;

import android.content.Context;
import android.content.pm.PackageManager;
import android.graphics.ImageFormat;
import android.hardware.Camera;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.widget.FrameLayout;
import android.widget.Toast;

public class MainActivity extends AppCompatActivity {
    public Camera mCamera;
    private CameraPreview mPreview;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        if(checkCameraHardware(this)==false){
            Toast.makeText(MainActivity.this, "This device does not have camera", Toast.LENGTH_LONG).show();
            finish();
        }
        mCamera = getCameraInstance();
        mCamera.setPreviewCallback(new Camera.PreviewCallback() {
            @Override
            public void onPreviewFrame(byte[] data, Camera camera) {
                Log.d("Camera1","data lenght is:"+data.length);
            }
        });
        if(mCamera==null){
            Toast.makeText(MainActivity.this, "Can't access camera", Toast.LENGTH_LONG).show();
            finish();
        }
        Camera.Parameters cameraParametars = mCamera.getParameters();
        cameraParametars.setPreviewSize(640,480);
        cameraParametars.setPreviewFormat(ImageFormat.RGB_565);
        mCamera.setParameters(cameraParametars);

        mPreview = new CameraPreview(this, mCamera);
        FrameLayout preview = (FrameLayout) findViewById(R.id.camera_preview);
        preview.addView(mPreview);


    }

    private boolean checkCameraHardware(Context context) {
        if (context.getPackageManager().hasSystemFeature(PackageManager.FEATURE_CAMERA)){
            // this device has a camera
            return true;
        } else {
            // no camera on this device
            return false;
        }
    }
    public static Camera getCameraInstance(){
        Camera c = null;
        try {
            c = Camera.open(); // attempt to get a Camera instance

        }
        catch (Exception e){
            // Camera is not available (in use or does not exist)
        }
        return c; // returns null if camera is unavailable
    }


}

CameraPreview.java CameraPreview.java

package com.example.nikola.camera;

/**
 * Created by Nikola on 8/4/2016.
 */

import android.content.Context;
import android.hardware.Camera;
import android.util.Log;
import android.view.SurfaceHolder;
import android.view.SurfaceView;

import java.io.IOException;

/** A basic Camera preview class */
public class CameraPreview extends SurfaceView implements  SurfaceHolder.Callback {
    private SurfaceHolder mHolder;
    private Camera mCamera;

    public CameraPreview(Context context, Camera camera) {
        super(context);
        mCamera = camera;

        // Install a SurfaceHolder.Callback so we get notified when the
        // underlying surface is created and destroyed.
        mHolder = getHolder();
        mHolder.addCallback(this);
        // deprecated setting, but required on Android versions prior to 3.0
        mHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);

    }

    public void surfaceCreated(SurfaceHolder holder) {
        // The Surface has been created, now tell the camera where to draw the preview.
        try {
            mCamera.setPreviewDisplay(holder);
            mCamera.startPreview();
        } catch (IOException e) {
            Log.d("Camera_app", "Error setting camera preview: " + e.getMessage());
        }
    }

    public void surfaceDestroyed(SurfaceHolder holder) {
        // empty. Take care of releasing the Camera preview in your activity.
    }

    public void surfaceChanged(SurfaceHolder holder, int format, int w, int h) {
        // If your preview can change or rotate, take care of those events here.
        // Make sure to stop the preview before resizing or reformatting it.

        if (mHolder.getSurface() == null){
            // preview surface does not exist
            return;
        }

        // stop preview before making changes
        try {
            mCamera.stopPreview();
        } catch (Exception e){
            // ignore: tried to stop a non-existent preview
        }

        // set preview size and make any resize, rotate or
        // reformatting changes here

        // start preview with new settings
        try {
            mCamera.setPreviewDisplay(mHolder);
            mCamera.startPreview();

        } catch (Exception e){
            Log.d("Camera_app", "Error starting camera preview: " + e.getMessage());
        }
    }


}

First permission add for camera and take image in sdcard 相机的优先权限添加并在SD卡中拍摄图像

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

On click on preview Photo is click and preview You get path in callback 在单击预览时单击并预览照片您将在回调中获得路径

   preview.setOnClickListener(new View.OnClickListener() {
 @Override
 public void onClick(View v) {
    mCamera.takePicture(null, null, mPicture);
 }
  });

Take In class Imagepath your path of image take this in your class 在班级Imagepath中学习图像路径在班级中学习

   private Camera.PictureCallback mPicture = new Camera.PictureCallback() {



    public void onPictureTaken(byte[] data, Camera camera) {

        // Replacing the button after a photho was taken.


        // File name of the image that we just took.
        String fileName = "IMG_" + new SimpleDateFormat("yyyyMMdd_HHmmss").format(new Date()).toString() + ".jpg";

        // Creating the directory where to save the image. Sadly in older
        // version of Android we can not get the Media catalog name

       File sdRoot = Environment.getExternalStorageDirectory();


    // have the object build the directory structure, if needed.

        String      dir = "/Capture/path/";

        File mkDir = new File(sdRoot, dir);
        mkDir.mkdirs();

        // Main file where to save the data that we recive from the camera
        File pictureFile = new File(sdRoot, dir + fileName);

     String   imagePath=pictureFile.getPath();
        System.out.print("imagePath"+imagePath);

        try {
            FileOutputStream purge = new FileOutputStream(pictureFile);
            purge.write(data);
            purge.close();
        } catch (FileNotFoundException e) {
            Log.d("DG_DEBUG", "File not found: " + e.getMessage());
        } catch (IOException e) {
            Log.d("DG_DEBUG", "Error accessing file: " + e.getMessage());
        }

        // Adding Exif data for the orientation. For some strange reason the
        // ExifInterface class takes a string instead of a file.
        try {
            exif = new ExifInterface("/sdcard/" + dir + fileName);
            exif.setAttribute(ExifInterface.TAG_ORIENTATION, "" + orientation);
            exif.saveAttributes();
        } catch (IOException e) {
            e.printStackTrace();
        }

    }
};

But I recommended you the Camera2Basic... Which have tons of example because this is deprecated 但我建议您使用Camera2Basic ...上面有很多示例,因为已弃用

I recommeded you to do this example which run in marashmallow or all devices work properly... 我建议您做一个在marashmallow中运行或所有设备都能正常运行的示例...

https://github.com/googlesamples/android-Camera2Basic https://github.com/googlesamples/android-Camera2Basic

For face Detaction 面部识别

You must register a FaceDetectionListener and then call camera.startFaceDetection() . 您必须注册一个FaceDetectionListener ,然后调用camera.startFaceDetection()

Please see the link for face detaction.. 请参见该链接以了解脸部表情。

https://docs.google.com/open?id=0B2Nu5U2Cz81qZExGQ25sWVdRd21IOExUUTZsZzFoZw https://docs.google.com/open?id=0B2Nu5U2Cz81qZExGQ25sWVdRd21IOExUUTZsZzFoZw

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM