2012-02-06 56 views
-1

你好我寫了一個應用程序,同時部署顯示錯誤行mCamera = Camera.open(); 其中mCamera是Camera的參考。打開相機錯誤可以在android中解決嗎?

請問如何解決任何幫助?

謝謝

+0

請發表您的logcat的。 – Ghost 2012-02-06 07:43:08

+0

這是一件好事,你發現這個錯誤,導致目前使用相機的數百個應用程序必須被破壞!接得好!除了諷刺之外,你是否真的期望得到這個模糊不清的問題的幫助? – 2012-02-06 07:43:52

+0

你好,他們現在工作正常,權限沒有給出。感謝您寶貴的時間。 – Bam 2012-02-06 08:06:12

回答

5

如果其他應用程序正在使用相機,則需要先檢查並呼叫釋放功能。

我用下面的代碼工作正常。它捕獲圖像並將其保存到媒體卡上。不要忘記將權限放在清單文件中。

<uses-permission android:name="android.permission.CAMERA" /> 
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /> 
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> 
<uses-feature android:name="android.hardware.camera" /> 

代碼:

//Surface View for displaying the content 

package my.custom.cam; 

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

public class CameraPreview1 extends SurfaceView implements SurfaceHolder.Callback { 
    private SurfaceHolder mHolder; 
    private Camera mCamera; 

    public CameraPreview1(Context context, Camera camera) { 
     super(context); 
     Log.i("#####","constructor is getting called"); 
     mCamera = camera; 
//  mCamera = CustomCameraActivity.getCameraInstance(); 

     // 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. 
     Log.i("*****", "Surface created....."); 
     try { 
      if(holder == null) { Log.i("%%%%%%%%%","Holder is null"); return; } 
      mCamera.setPreviewDisplay(holder); 
      mCamera.startPreview(); 
     } catch (IOException e) { 
      Log.d("********", "Error setting camera preview: " + e.getMessage()); 
     } 
    } 

    public void surfaceDestroyed(SurfaceHolder holder) { 

     Log.i("*****", "Surface destroyed....."); 
     mCamera.release(); 
     // 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. 
     Log.i("*****", "Surface changed....."); 

     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("*******", "Error starting camera preview: " + e.getMessage()); 
     } 
    } 
} 


// Activity to use 

package my.custom.cam; 

import java.io.File; 
import java.io.FileNotFoundException; 
import java.io.FileOutputStream; 
import java.io.IOException; 
import java.text.SimpleDateFormat; 
import java.util.Date; 

import android.app.Activity; 
import android.hardware.Camera; 
import android.hardware.Camera.PictureCallback; 
import android.net.Uri; 
import android.os.Bundle; 
import android.os.Environment; 
import android.util.Log; 
import android.view.View; 
import android.view.View.OnClickListener; 
import android.widget.Button; 
import android.widget.FrameLayout; 

public class CustomCameraActivity extends Activity { 
    /** Called when the activity is first created. */ 

    private Camera mCamera; 
    private CameraPreview1 mPreview; 
    private PictureCallback mPicture ; 

    @Override 
    public void onCreate(Bundle savedInstanceState) 
    { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 

     // Create an instance of Camera 
     mCamera = getCameraInstance(); 

     // Create our Preview view and set it as the content of our activity. 
     mPreview = new CameraPreview1(this, mCamera); 
     FrameLayout preview = (FrameLayout) findViewById(R.id.camera_preview); 
     preview.addView(mPreview); 

     Button clickButton = (Button) findViewById(R.id.button_capture); 
     clickButton.setOnClickListener(new OnClickListener() { 

      @Override 
      public void onClick(View v) { 
       // TODO Auto-generated method stub 

       mCamera.takePicture(null, null, mPicture); 
      } 
     }); 

     mPicture = new PictureCallback() { 

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

       File pictureFile = getOutputMediaFile(MEDIA_TYPE_IMAGE); 
       if (pictureFile == null){ 
        Log.d("********", "Error creating media file, check storage permissions: "); 

        return; 
       } 

       try { 
        FileOutputStream fos = new FileOutputStream(pictureFile); 
        fos.write(data); 
        fos.close(); 
        Log.i("$$$$$$$$$", "file saved successfully...."); 
       } catch (FileNotFoundException e) { 
        Log.e("********", "File not found: " + e.getMessage()); 
       } catch (IOException e) { 
        Log.e("********", "Error accessing file: " + e.getMessage()); 
       } 
      } 
     }; 
    } 

    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 
    } 

    public static final int MEDIA_TYPE_IMAGE = 1; 
    public static final int MEDIA_TYPE_VIDEO = 2; 

    /** Create a file Uri for saving an image or video */ 
    private static Uri getOutputMediaFileUri(int type){ 
     return Uri.fromFile(getOutputMediaFile(type)); 
    } 

    /** Create a File for saving an image or video */ 
    private static File getOutputMediaFile(int type){ 
     // To be safe, you should check that the SDCard is mounted 
     // using Environment.getExternalStorageState() before doing this. 

     File mediaStorageDir = new File(Environment.getExternalStoragePublicDirectory(
        Environment.DIRECTORY_PICTURES), "MyCameraApp"); 
     // This location works best if you want the created images to be shared 
     // between applications and persist after your app has been uninstalled. 

     // Create the storage directory if it does not exist 
     if (! mediaStorageDir.exists()){ 
      if (! mediaStorageDir.mkdirs()){ 
       Log.d("MyCameraApp", "failed to create directory"); 
       return null; 
      } 
     } 

     // Create a media file name 
     String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss").format(new Date()); 
     File mediaFile; 
     if (type == MEDIA_TYPE_IMAGE){ 
      mediaFile = new File(mediaStorageDir.getPath() + File.separator + 
        "IMG_"+ timeStamp + ".jpg"); 
     } else if(type == MEDIA_TYPE_VIDEO) { 
      mediaFile = new File(mediaStorageDir.getPath() + File.separator + 
        "VID_"+ timeStamp + ".mp4"); 
     } else { 
      return null; 
     } 

     return mediaFile; 
    } 
} 
+0

感謝它現在正常工作,我的應用程序沒有授予相機的權限? – Bam 2012-02-06 07:59:17

相關問題