2013-07-31 18 views
-3

嘿,我是新來的應用程序開發,我試圖建立一個應用程序,其中包括相機。 我跟着android開發人員指南,但該應用程序不會運行,試圖尋找在這個網站的舊答案,沒有找到任何幫助我,我要求你的幫助。 這裏是我的代碼:在Android上構建相機應用程序

package com.example.camera; 

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.content.Context; 
import android.content.pm.PackageManager; 
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.widget.Button; 
import android.widget.FrameLayout; 

public class MainActivity extends Activity { 
public static final int MEDIA_TYPE_IMAGE = 1; 
public static String TAG="MainActivity"; 
private Camera camera; 
private CameraPreview preview; 
private PictureCallback picture; 
private FileNotFoundException err; 
public static Camera getCameraInstance(){ 
    Camera c = null; 
    try { 
     c = Camera.open(); // attempt to get a Camera insta 
    } 
    catch (Exception e){ 
     // Camera is not available (in use or does not exist) 
    } 
    return c; // returns null if camera is unavailable 
} 
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; 
    } 
} 
@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 

    camera = getCameraInstance(); 
    preview = new CameraPreview(this, camera); 
    FrameLayout FLpreview = (FrameLayout) findViewById(R.id.camera_preview); 
    FLpreview.addView(preview); 

    picture = new PictureCallback() { 

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

      File pictureFile = getOutputMediaFile(MEDIA_TYPE_IMAGE); 
      if (pictureFile == null){ 
       Log.d(TAG, "Error creating media file, check storage permissions: "+ err.getMessage()); 
       return; 
      } 

      try { 
       FileOutputStream fos = new FileOutputStream(pictureFile); 
       fos.write(data); 
       fos.close(); 
      } catch (FileNotFoundException e) { 
       Log.d(TAG, "File not found: " + e.getMessage()); 
      } catch (IOException e) { 
       Log.d(TAG, "Error accessing file: " + e.getMessage()); 
      } 
     } 
    }; 
    Button captureButton = (Button) findViewById(R.id.button_capture); 
    captureButton.setOnClickListener(
     new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       // get an image from the camera 
       camera.takePicture(null, null, picture); 
      } 
     } 
    ); 
} 
/** A safe way to get an instance of the Camera object. */ 


    private void releaseCamera(){ 
     if (camera != null){ 
      camera.release();  // release the camera for other applications 
      camera = null; 
     } 
    } 
    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 { 
      return null; 
     } 

     return mediaFile; 
    } 

} 

和這裏的代碼爲surfaceholder:

package com.example.camera; 

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 CameraPreview extends SurfaceView implements SurfaceHolder.Callback { 
private SurfaceHolder holder; 
private Camera camera; 
public static String TAG="MainActivity"; 
public CameraPreview(Context context, Camera cam) { 
    super(context); 
    camera=cam; 
    holder=getHolder(); 
    holder.addCallback(this); 
    holder.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 { 
    camera.setPreviewDisplay(holder); 
    camera.startPreview(); 
} catch (IOException e) { 
    Log.d(TAG, "Error setting camera preview: " + e.getMessage()); 
} 
} 
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 (holder.getSurface() == null){ 
    // preview surface does not exist 
    return; 
} 

// stop preview before making changes 
try { 
    camera.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 { 
    camera.setPreviewDisplay(holder); 
    camera.setDisplayOrientation(0); 
    camera.startPreview(); 

} catch (Exception e){ 
    Log.d(TAG, "Error starting camera preview: " + e.getMessage()); 
} 
} 
public void surfaceDestroyed(SurfaceHolder holder) { 
// empty. Take care of releasing the Camera preview in your activity. 
} 


} 

;最後,logcat的:

07-31 12:06:06.361: W/Camera(998): ICamera died 
07-31 12:06:06.361: W/Camera(998): Camera server died! 
07-31 12:06:06.381: E/Camera(998): Error 100 

感謝一大堆!

+0

如果你還不熟悉編程,爲什麼不從更簡單的事情開始呢? – ClaireG

+0

a。我對編程並不陌生,我對android開發很陌生,對不起,如果不清楚的話。 b。我喜歡挑戰自己。 c。這是我正在進行的一個項目的一部分。 thankyou :) – Meshi

回答

0

稍後嘗試getCameraInstance(),例如, onStart()