2013-02-26 52 views
1

我写了我自己的相机应用程序。当我在eclipse模拟器中运行应用程序时,它工作正常,但是当我将它安装在真实手机上并运行它时,当我点击启动相机活动的按钮时,它会显示“应用程序示例意外停止工作,请重试以后“,我已经在我的清单中写入了相机许可。可能是什么问题呢 ?相机应用程序在模拟器中工作,但停在真实的手机?

这里是我的相机应用程序的代码:

public class CameraActivity extends Activity{ 
    public static final int MEDIA_TYPE_IMAGE = 1 ; 
    private Camera mCamera; 
    private CameraPreview mPreview; 
    Uri photoPath ; 
    protected void onStop() 
    { 
     super.onStop(); 
     mCamera.release(); 
    } 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_camera); 

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

     // Create our Preview view and set it as the content of our activity. 
     mPreview = new CameraPreview(this, mCamera); 
     FrameLayout preview = (FrameLayout) findViewById(R.id.camera_preview); 
     ViewGroup.LayoutParams previewParam = preview.getLayoutParams() ; 
     Parameters cameraParam = mCamera.getParameters() ; 
     double ratio = (double)cameraParam.getPictureSize().height/(double)cameraParam.getPictureSize().width ; 
     // previewParam.height= cameraParam.getPictureSize().height/5 ; 
     // previewParam.width = cameraParam.getPictureSize().width/5 ; 
     Display display = getWindowManager().getDefaultDisplay(); 
     Point size = new Point(); 
     display.getSize(size); 
     int width = size.x; 
     int height = size.y; 
     previewParam.width = width; 
     previewParam.height = (int)(previewParam.width * ratio) ; 
     // preview.setLayoutParams(previewParam) ; 
     preview.addView(mPreview); 
    } 

    //Camera Classes here 
    private final static String TAG = "Navid"; 
    public static Camera getCameraInstance() 
    { 
     Camera c = null ; 
     try 
     { 
      c = Camera.open() ; 
     } 
     catch(Exception e) 
     { 
     } 
     return c ; 
    } 
    public class CameraPreview extends SurfaceView implements SurfaceHolder.Callback 
    { 
     private SurfaceHolder mHolder ; 
     private Camera mCamera; 
     public CameraPreview(Context context , Camera camera) 
     { 
      super(context) ; 
      mCamera = camera ; 

      mHolder = getHolder(); 
      mHolder.addCallback(this); 
      mHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS); 
     } 
     public void surfaceCreated(SurfaceHolder holder) 
     { 
      try 
      { 
       mCamera.setPreviewDisplay(holder); 
       mCamera.startPreview(); 
      } 
      catch(IOException e) 
      { 
       Log.d(TAG,"Camera Preview Failed!: "+e.getMessage()); 
      } 
     } 
     public void surfaceChanged(SurfaceHolder holder , int m , int n , int w) 
     { 
     } 
     public void surfaceDestroyed(SurfaceHolder holder) 
     {   
     } 
    } 
    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; 
    } 
    //save the picture here 
    private PictureCallback mPicture = new PictureCallback() { 

    // public final static int MEDIA_TYPE_IMAGE = 1 ; 
     @Override 
     public void onPictureTaken(byte[] data, Camera camera) { 

      File pictureFile = getOutputMediaFile(MEDIA_TYPE_IMAGE); 
      photoPath = Uri.fromFile(pictureFile); 
      if (pictureFile == null){ 
       Log.d("Errore Doorbin", "Error creating media file, check storage permissions: "); 
       return; 
      } 

      try { 
       FileOutputStream fos = new FileOutputStream(pictureFile); 
       fos.write(data); 
       fos.close(); 
       // these lines are for the gallery to scan the SDCard manually 
       File mediaStorageDir = new File(Environment.getExternalStoragePublicDirectory(
         Environment.DIRECTORY_PICTURES), "MyCameraApp"); 
        sendBroadcast(new Intent(Intent.ACTION_MEDIA_MOUNTED, 
         Uri.parse("file://"+ mediaStorageDir))); 
       // photoPath = Uri.fromFile(mediaStorageDir) ; 
       /* MediaScannerConnection.scanFile(CameraActivity.this, 
         new String[] { fos.toString() }, null, 
         new MediaScannerConnection.OnScanCompletedListener() { 
        public void onScanCompleted(String path, Uri uri) { 
         // code to execute when scanning is complete 
        } 
       });*/ 
       // fos.close(); 
      } catch (FileNotFoundException e) { 
       Log.d("Errore Doorbin", "File not found: " + e.getMessage()); 
      } catch (IOException e) { 
       Log.d("Errore Doorbin", "Error accessing file: " + e.getMessage()); 
      } 
      catch (Exception e) 
      { 
       Log.d("Errore Doorbin", "errore Kolli dade!" + e.getMessage()) ; 
      } 
     } 
    }; 
    public void capture(View v) 
    { 
     //mCamera.takePicture(null, null, mPicture); 
     //mCamera.release(); 
     //mCamera = getCameraInstance() ; 
     //mCamera.startPreview(); 

     TakePictureTask takePicture = new TakePictureTask() ; 
     takePicture.execute() ; 
    } 
    public void accept(View v) 
    { 
     Intent data = new Intent() ; 
     data.setData(photoPath) ; 
     setResult(RESULT_OK, data); 
     finish() ; 
    } 
    public void retake(View v) 
    { 
     Button button = (Button)findViewById(R.id.button_accept); 
     button.setVisibility(View.GONE); 
     button = (Button)findViewById(R.id.button_capture) ; 
     button.setVisibility(View.VISIBLE) ; 
     button = (Button)findViewById(R.id.button_retake); 
     button.setVisibility(View.GONE) ; 

     mCamera.startPreview(); 
    } 
    /** 
    * A pretty basic example of an AsyncTask that takes the photo and 
    * then sleeps for a defined period of time before finishing. Upon 
    * finishing, it will restart the preview - Camera.startPreview(). 
    */ 

    private class TakePictureTask extends AsyncTask<Void, Void, Void> { 

     @Override 
     protected void onPostExecute(Void result) { 
      // This returns the preview back to the live camera feed 
      Button button = (Button)findViewById(R.id.button_accept) ; 
      button.setVisibility(View.VISIBLE) ; 
      button = (Button)findViewById(R.id.button_retake) ; 
      button.setVisibility(View.VISIBLE); 
      button = (Button)findViewById(R.id.button_capture); 
      button.setVisibility(View.GONE); 
      //mCamera.startPreview(); 
     } 

     @Override 
     protected Void doInBackground(Void... params) { 
      mCamera.takePicture(null, null, mPicture); 

      // Sleep for however long, you could store this in a variable and 
      // have it updated by a menu item which the user selects. 
      try { 
       Thread.sleep(3000); // 3 second preview 
      } catch (InterruptedException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      } 

      return null; 
     } 

    } 

} 

UPDATE: 手机的logcat中这样说:

FATAL ECXEPTION: main 
java.lang.NoSuchMethodError: Android.View.Display.getSize 

是因为手机的Android API是老了吗? 我的手机的Android版本是2.2

+2

你可以发表你的logcat的错误 – 2013-02-26 09:54:45

+0

logcat的真实电话吗? – Navid777 2013-02-26 09:57:53

+1

你不能在真正的手机上调试你的应用程序吗? – 2013-02-26 09:58:49

回答

2

你在diaplay.getSize歌厅错误()用这种方法来获得尺寸

private static Point getDisplaySize(final Display display) { 
final Point point = new Point(); 
try { 
    display.getSize(point); 
} catch (java.lang.NoSuchMethodError ignore) { // Older device 
    point.x = display.getWidth(); 
    point.y = display.getHeight(); 
} 
return point; 
} 
相关问题