2016-08-01 10 views
1

カメラのプレビューが機能しなくなりました。何が起きているのか?私のコードは私の電話でカメラを見つけたり見つけたりすることはできないと思います...私はプログラミングではとても新しいです。ここでAndroidコードで電話カメラにアクセスできません...どうしたの?

はエラーメッセージです:ここで

07-31 22:10:29.940 26291-26291/user.cameratest W/CameraBase: An error occurred while connecting to camera: 0 
07-31 22:10:30.168 26291-26320/user.cameratest E/Surface: getSlotFromBufferLocked: unknown buffer: 0xb9bfa3e8 
07-31 22:10:30.191 26291-26291/user.cameratest W/CameraBase: An error occurred while connecting to camera: 0 
07-31 22:10:36.957 26291-26320/user.cameratest E/Surface: getSlotFromBufferLocked: unknown buffer: 0xb9c89198 
07-31 22:10:40.458 26291-26320/user.cameratest E/Surface: getSlotFromBufferLocked: unknown buffer: 0xb9b47570 

はコードです:

のAndroidManifest.xml

<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
package="user.cameratest"> 

<uses-feature android:name="android.hardware.camera" /> 

<uses-permission android:name="android.permission.CAMERA" /> 
<uses-permission android:name="android.hardware.camera.autofocus" /> 
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> 
<!--uses-permission android:name="android.permission.INTERNET" /> 
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /--> 

<application 
    android:icon="@mipmap/ic_launcher" 
    android:label="@string/app_name" > 
    <activity 
     android:label="@string/app_name" 
     android:name=".cameraActivity" 
     android:screenOrientation="landscape" > 
     <intent-filter > 
      <action android:name="android.intent.action.MAIN" /> 

      <category android:name="android.intent.category.LAUNCHER" /> 
     </intent-filter> 
    </activity> 
</application> 

cameraActivity.java

package user.cameratest; 

import java.io.File; 
import java.io.FileNotFoundException; 
import java.io.FileOutputStream; 
import java.io.IOException; 

import android.app.Activity; 
import android.content.Context; 
import android.content.Intent; 
import android.hardware.Camera; 
import android.hardware.Camera.PictureCallback; 
import android.hardware.Camera.ShutterCallback; 
import android.net.Uri; 
import android.os.AsyncTask; 
import android.os.Bundle; 
import android.os.Environment; 
import android.util.Log; 
import android.view.SurfaceView; 
import android.view.View; 
import android.view.View.OnClickListener; 
import android.view.ViewGroup.LayoutParams; 
import android.view.Window; 
import android.view.WindowManager; 
import android.widget.Button; 
import android.widget.FrameLayout; 
import android.widget.Toast; 

public class cameraActivity extends Activity { // 
    private static final String TAG = "cameraActivity"; 
    cameraPreview preview; 
    Button buttonClick; 
    Camera camera; // 
    Activity act; 
    Context ctx; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { // 
     super.onCreate(savedInstanceState); // 
     ctx = this; 
     act = this; 
     requestWindowFeature(Window.FEATURE_NO_TITLE); // 
     getWindow().addFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN); // 

     setContentView(R.layout.camera_layout); // 

     preview = new cameraPreview(this, (SurfaceView)findViewById(R.id.surfaceView)); 
     preview.setLayoutParams(new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT)); 
     ((FrameLayout) findViewById(R.id.layout)).addView(preview); 
     preview.setKeepScreenOn(true); 

     preview.setOnClickListener(new OnClickListener() { 

      @Override 
      public void onClick(View arg0) { 
       camera.takePicture(shutterCallback, rawCallback, jpegCallback); 
      } 
     }); 

     Toast.makeText(ctx, getString(R.string.take_photo_help), Toast.LENGTH_LONG).show(); 

     //  buttonClick = (Button) findViewById(R.id.btnCapture); 
     // 
     //  buttonClick.setOnClickListener(new OnClickListener() { 
     //   public void onClick(View v) { 
     ////    preview.camera.takePicture(shutterCallback, rawCallback, jpegCallback); 
     //    camera.takePicture(shutterCallback, rawCallback, jpegCallback); 
     //   } 
     //  }); 
     // 
     //  buttonClick.setOnLongClickListener(new OnLongClickListener(){ 
     //   @Override 
     //   public boolean onLongClick(View arg0) { 
     //    camera.autoFocus(new AutoFocusCallback(){ 
     //     @Override 
     //     public void onAutoFocus(boolean arg0, Camera arg1) { 
     //      //camera.takePicture(shutterCallback, rawCallback, jpegCallback); 
     //     } 
     //    }); 
     //    return true; 
     //   } 
     //  }); 
    } 

    @Override 
    protected void onResume() { 
     super.onResume(); 
     int numCams = Camera.getNumberOfCameras(); 
     if(numCams > 0){ 
      try{ 
       camera = Camera.open(0); 
       camera.startPreview(); 
       preview.setCamera(camera); 
      } catch (RuntimeException ex){ 
       Toast.makeText(ctx, getString(R.string.camera_not_found), Toast.LENGTH_LONG).show(); 
      } 
     } 
    } 

    @Override 
    protected void onPause() { 
     if(camera != null) { 
      camera.stopPreview(); 
      preview.setCamera(null); 
      camera.release(); 
      camera = null; 
     } 
     super.onPause(); 
    } 

    private void resetCam() { 
     camera.startPreview(); 
     preview.setCamera(camera); 
    } 

    private void refreshGallery(File file) { 
     Intent mediaScanIntent = new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE); 
     mediaScanIntent.setData(Uri.fromFile(file)); 
     sendBroadcast(mediaScanIntent); 
    } 

    ShutterCallback shutterCallback = new ShutterCallback() { 
     public void onShutter() { 
      //   Log.d(TAG, "onShutter'd"); 
     } 
    }; 

    PictureCallback rawCallback = new PictureCallback() { 
     public void onPictureTaken(byte[] data, Camera camera) { 
      //   Log.d(TAG, "onPictureTaken - raw"); 
     } 
    }; 

    PictureCallback jpegCallback = new PictureCallback() { 
     public void onPictureTaken(byte[] data, Camera camera) { 
      new SaveImageTask().execute(data); 
      resetCam(); 
      Log.d(TAG, "onPictureTaken - jpeg"); 
     } 
    }; 

    private class SaveImageTask extends AsyncTask<byte[], Void, Void> { 

     @Override 
     protected Void doInBackground(byte[]... data) { 
      FileOutputStream outStream = null; 

      // Write to SD Card 
      try { 
       File sdCard = Environment.getExternalStorageDirectory(); 
       File dir = new File (sdCard.getAbsolutePath() + "/camtest"); 
       dir.mkdirs(); 

       String fileName = String.format("%d.jpg", System.currentTimeMillis()); 
       File outFile = new File(dir, fileName); 

       outStream = new FileOutputStream(outFile); 
       outStream.write(data[0]); 
       outStream.flush(); 
       outStream.close(); 

       Log.d(TAG, "onPictureTaken - wrote bytes: " + data.length + " to " + outFile.getAbsolutePath()); 

       refreshGallery(outFile); 
      } catch (FileNotFoundException e) { 
       e.printStackTrace(); 
      } catch (IOException e) { 
       e.printStackTrace(); 
      } finally { 
      } 
      return null; 
     } 

    } 
} 

cameraPreview.java

package user.cameratest; 

/** 
* @author Jose Davis Nidhin 
*/ 

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

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

class cameraPreview extends ViewGroup implements SurfaceHolder.Callback { // 
    private final String TAG = "cameraPreview"; // 

    SurfaceView mSurfaceView; // 
    SurfaceHolder mHolder; // 
    Size mPreviewSize; // 
    List<Size> mSupportedPreviewSizes; // 
    Camera mCamera; // 

    cameraPreview(Context context, SurfaceView sv) { // 
     super(context); // 

     mSurfaceView = sv; // 
//  addView(mSurfaceView); 

     mHolder = mSurfaceView.getHolder(); // 
     mHolder.addCallback(this); // 
     mHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS); // 
    } 

    public void setCamera(Camera camera) { // 
     mCamera = camera; // 
     if (mCamera != null) { // 
      mSupportedPreviewSizes = mCamera.getParameters().getSupportedPreviewSizes(); // 
      requestLayout(); // 

      // get Camera parameters 
      Camera.Parameters params = mCamera.getParameters(); // 

      List<String> focusModes = params.getSupportedFocusModes(); // 
      if (focusModes.contains(Camera.Parameters.FOCUS_MODE_AUTO)) { // 
       // set the focus mode 
       params.setFocusMode(Camera.Parameters.FOCUS_MODE_AUTO); // 
       // set Camera parameters 
       mCamera.setParameters(params); // 
      } 
     } 
    } 

    @Override 
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { // 
     // We purposely disregard child measurements because act as a 
     // wrapper to a SurfaceView that centers the camera preview instead 
     // of stretching it. 
     final int width = resolveSize(getSuggestedMinimumWidth(), widthMeasureSpec); // 
     final int height = resolveSize(getSuggestedMinimumHeight(), heightMeasureSpec); // 
     setMeasuredDimension(width, height); // 

     if (mSupportedPreviewSizes != null) { // 
      mPreviewSize = getOptimalPreviewSize(mSupportedPreviewSizes, width, height); // 
     } 
    } 

    @Override 
    protected void onLayout(boolean changed, int l, int t, int r, int b) { // 
     if (changed && getChildCount() > 0) { 
      final View child = getChildAt(0); 

      final int width = r - l; 
      final int height = b - t; 

      int previewWidth = width; 
      int previewHeight = height; 
      if (mPreviewSize != null) { 
       previewWidth = mPreviewSize.width; 
       previewHeight = mPreviewSize.height; 
      } 

      // Center the child SurfaceView within the parent. 
      if (width * previewHeight > height * previewWidth) { 
       final int scaledChildWidth = previewWidth * height/previewHeight; 
       child.layout((width - scaledChildWidth)/2, 0, 
         (width + scaledChildWidth)/2, height); 
      } else { 
       final int scaledChildHeight = previewHeight * width/previewWidth; 
       child.layout(0, (height - scaledChildHeight)/2, 
         width, (height + scaledChildHeight)/2); 
      } 
     } 
    } 

    public void surfaceCreated(SurfaceHolder holder) { 
     // The Surface has been created, acquire the camera and tell it where 
     // to draw. 
     try { 
      if (mCamera != null) { 
       mCamera.setPreviewDisplay(holder); 
      } 
     } catch (IOException exception) { 
      Log.e(TAG, "IOException caused by setPreviewDisplay()", exception); 
     } 
    } 

    public void surfaceDestroyed(SurfaceHolder holder) { 
     // Surface will be destroyed when we return, so stop the preview. 
     if (mCamera != null) { 
      mCamera.stopPreview(); 
     } 
    } 


    private Size getOptimalPreviewSize(List<Size> sizes, int w, int h) { 
     final double ASPECT_TOLERANCE = 0.1; 
     double targetRatio = (double) w/h; 
     if (sizes == null) return null; 

     Size optimalSize = null; 
     double minDiff = Double.MAX_VALUE; 

     int targetHeight = h; 

     // Try to find an size match aspect ratio and size 
     for (Size size : sizes) { 
      double ratio = (double) size.width/size.height; 
      if (Math.abs(ratio - targetRatio) > ASPECT_TOLERANCE) continue; 
      if (Math.abs(size.height - targetHeight) < minDiff) { 
       optimalSize = size; 
       minDiff = Math.abs(size.height - targetHeight); 
      } 
     } 

     // Cannot find the one match the aspect ratio, ignore the requirement 
     if (optimalSize == null) { 
      minDiff = Double.MAX_VALUE; 
      for (Size size : sizes) { 
       if (Math.abs(size.height - targetHeight) < minDiff) { 
        optimalSize = size; 
        minDiff = Math.abs(size.height - targetHeight); 
       } 
      } 
     } 
     return optimalSize; 
    } 

    public void surfaceChanged(SurfaceHolder holder, int format, int w, int h) { 
     if(mCamera != null) { 
      Camera.Parameters parameters = mCamera.getParameters(); 
      parameters.setPreviewSize(mPreviewSize.width, mPreviewSize.height); 
      requestLayout(); 

      mCamera.setParameters(parameters); 
      mCamera.startPreview(); 
     } 
    } 

} 

camera_layout.xml

<?xml version="1.0" encoding="utf-8"?> 
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:id="@+id/layout" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" > 

    <SurfaceView 
     android:id="@+id/surfaceView" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" /> 

    <!-- Button 
     android:id="@+id/btnCapture" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_gravity="center_horizontal" 
     android:background="@drawable/round_button" 
     android:text="@string/btn_capture" /--> 

</FrameLayout> 
+0

をandroid.hardware.camera2使用すべき推奨されていませんが、将来的には、あなたが大文字で始まる任意のJavaクラスに名前を付ける必要があります: 'CameraActivity'と' CameraPreview'があなたのケースになります – Jeeter

答えて

関連する問題