2011-07-26 19 views
1

我曾嘗試使用意圖啓動相機在Android中,這樣的事情:問題在建設自己的相機在android系統

Intent camera = new Intent(MediaStore.ACTION_IMAGE_CAPTURE) 

但自從我保存的圖片進行水平取向,並能找到一種方法來解決這個問題我試圖用這個神奇的代碼段建設自己的相機在安卓

public class EditPhoto extends Activity implements SurfaceHolder.Callback, 
     OnClickListener { 
    static final int FOTO_MODE = 0; 
    private static final String TAG = "CameraTest"; 
    Camera mCamera; 
    boolean mPreviewRunning = false; 
    private Context mContext = this; 

    public void onCreate(Bundle icicle) { 
     super.onCreate(icicle); 

     Log.e(TAG, "onCreate"); 

     Bundle extras = getIntent().getExtras(); 

     getWindow().setFormat(PixelFormat.TRANSLUCENT); 
     requestWindowFeature(Window.FEATURE_NO_TITLE); 
     getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, 
       WindowManager.LayoutParams.FLAG_FULLSCREEN); 
     setContentView(R.layout.editphoto); 
     mSurfaceView = (SurfaceView) findViewById(R.id.surface_camera); 
     mSurfaceView.setOnClickListener(this); 
     mSurfaceHolder = mSurfaceView.getHolder(); 
     mSurfaceHolder.addCallback(this); 
     mSurfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS); 
    } 

    @Override 
    protected void onRestoreInstanceState(Bundle savedInstanceState) { 
     super.onRestoreInstanceState(savedInstanceState); 
    } 

    Camera.PictureCallback mPictureCallback = new Camera.PictureCallback(){ 
     public void onPictureTaken(byte[] imageData, Camera c) { 

      if (imageData != null) { 

       Intent mIntent = new Intent(); 

       StoreByteImage(mContext, imageData, 50, 
         "ImageName"); 
       mCamera.startPreview(); 

       setResult(FOTO_MODE, mIntent); 
       finish(); 

      } 
     } 
    }; 

    protected void onResume() { 
     Log.e(TAG, "onResume"); 
     super.onResume(); 
    } 

    protected void onSaveInstanceState(Bundle outState) { 
     super.onSaveInstanceState(outState); 
    } 

    protected void onStop() { 
     Log.e(TAG, "onStop"); 
     super.onStop(); 
    } 

    public void surfaceCreated(SurfaceHolder holder) { 
     Log.e(TAG, "surfaceCreated"); 
     mCamera = Camera.open(); 

    } 

    public void surfaceChanged(SurfaceHolder holder, int format, int w, int h) { 
     Log.e(TAG, "surfaceChanged"); 

     // XXX stopPreview() will crash if preview is not running 
     if (mPreviewRunning) { 
      mCamera.stopPreview(); 
     } 

     Camera.Parameters p = mCamera.getParameters(); 
     p.setPreviewSize(w, h); 
     mCamera.setParameters(p); 
     try { 
      mCamera.setPreviewDisplay(holder); 
     } catch (IOException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 
     mCamera.startPreview(); 
     mPreviewRunning = true; 
    } 

    public void surfaceDestroyed(SurfaceHolder holder) { 
     Log.e(TAG, "surfaceDestroyed"); 
     mCamera.stopPreview(); 
     mPreviewRunning = false; 
     mCamera.release(); 
    } 

    private SurfaceView mSurfaceView; 
    private SurfaceHolder mSurfaceHolder; 

    public void onClick(View arg0) { 

     mCamera.takePicture(null, mPictureCallback, mPictureCallback); 

    } 

    public static boolean StoreByteImage(Context mContext, byte[] imageData, 
      int quality, String expName) { 

     File sdImageMainDirectory = new File("/sdcard"); 
     FileOutputStream fileOutputStream = null; 
     String nameFile; 
     try { 

      BitmapFactory.Options options=new BitmapFactory.Options(); 
      options.inSampleSize = 5; 
      Bitmap myImage = BitmapFactory.decodeByteArray(imageData, 0, 
        imageData.length,options); 
      fileOutputStream = new FileOutputStream(
        sdImageMainDirectory.toString() +"/image.jpg"); 
      BufferedOutputStream bos = new BufferedOutputStream(
        fileOutputStream); 

      myImage.compress(CompressFormat.JPEG, quality, bos); 

      bos.flush(); 
      bos.close(); 

      } catch (FileNotFoundException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
      } catch (IOException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
      } 

      return true; 
      } 

} 

我有相機的權限清單中的文件,但我看到的是一個白色的屏幕,看起來像這樣一個logcat的唯一的事情:

java.lang.RuntimeException: Fail to connect to camera service 
at android.hardware.Camera.native_setup(Native Method) 
at android.hardware.Camera.<init>(Camera.java:258) 
at android.hardware.Camera.open(Camera.java:235) 
    at com.SplashScreen.EditPhoto.surfaceCreated(EditPhoto.java:325) 
at android.view.SurfaceView.updateWindow(SurfaceView.java:543) 
at android.view.SurfaceView.dispatchDraw(SurfaceView.java:348) 
at android.view.ViewGroup.drawChild(ViewGroup.java:1644) 
at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1373) 
at android.view.ViewGroup.drawChild(ViewGroup.java:1644) 
at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1373) 
at android.view.ViewGroup.drawChild(ViewGroup.java:1644) 
at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1373) 
at android.view.View.draw(View.java:6883) 
at android.widget.FrameLayout.draw(FrameLayout.java:357) 
at com.android.internal.policy.impl.PhoneWindow$DecorView.draw(PhoneWindow.java:1862) 
at android.view.ViewRoot.draw(ViewRoot.java:1522) 
at android.view.ViewRoot.performTraversals(ViewRoot.java:1258) 
at android.view.ViewRoot.handleMessage(ViewRoot.java:1859) 
at android.os.Handler.dispatchMessage(Handler.java:99) 
at android.os.Looper.loop(Looper.java:123) 
at android.app.ActivityThread.main(ActivityThread.java:3647) 
at java.lang.reflect.Method.invokeNative(Native Method) 
at java.lang.reflect.Method.invoke(Method.java:507) 
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839) 
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597) 
at dalvik.system.NativeStart.main(Native Method) 
Force finishing activity com.SplashScreen/.EditPhoto 

那麼你會請客氣,告訴我我做錯了什麼?謝謝!

編輯:清單文件 -

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

XML文件:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
android:layout_width="fill_parent" 
android:layout_height="fill_parent" 
android:orientation="vertical"> 

<SurfaceView 
android:id="@+id/surface_camera" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
    /> 


</LinearLayout> 
+0

您正在使用哪個API級別?你有正確的權限嗎? –

+0

我正在使用API​​-7 – adrian

+0

我已經把我的清單文件中的行! – adrian

回答

3

旅遊活動EditPhoto.java在我的API級別7 AVD完美的工作,

package x.y; 

import java.io.BufferedOutputStream; 
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.graphics.Bitmap; 
import android.graphics.Bitmap.CompressFormat; 
import android.graphics.BitmapFactory; 
import android.hardware.Camera; 
import android.graphics.PixelFormat; 
import android.os.Bundle; 
import android.util.Log; 
import android.view.SurfaceHolder; 
import android.view.SurfaceView; 
import android.view.View; 
import android.view.View.OnClickListener; 
import android.view.Window; 
import android.view.WindowManager; 

public class EditPhoto extends Activity implements SurfaceHolder.Callback, OnClickListener { 
    static final int FOTO_MODE = 0; 
    private static final String TAG = "CameraTest"; 
    Camera mCamera; 
    boolean mPreviewRunning = false; 
    private Context mContext = this; 

    public void onCreate(Bundle icicle) { 
     super.onCreate(icicle); 

     Log.e(TAG, "onCreate"); 

     Bundle extras = getIntent().getExtras(); 

     getWindow().setFormat(PixelFormat.TRANSLUCENT); 
     requestWindowFeature(Window.FEATURE_NO_TITLE); 
     getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN); 
     setContentView(R.layout.main); 
     mSurfaceView = (SurfaceView) findViewById(R.id.surface_camera); 
     mSurfaceView.setOnClickListener(this); 
     mSurfaceHolder = mSurfaceView.getHolder(); 
     mSurfaceHolder.addCallback(this); 
     mSurfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS); 
    } 

    @Override 
    protected void onRestoreInstanceState(Bundle savedInstanceState) { 
     super.onRestoreInstanceState(savedInstanceState); 
    } 

    Camera.PictureCallback mPictureCallback = new Camera.PictureCallback(){ 
     public void onPictureTaken(byte[] imageData, Camera c) { 

      if (imageData != null) { 

       Intent mIntent = new Intent(); 

       StoreByteImage(mContext, imageData, 50, "ImageName"); 
       mCamera.startPreview(); 

       Bundle b = new Bundle(); 
       b.putByteArray("imageData", imageData); 
       Intent i = new Intent(mContext, ImageDisplayActivity.class); 
       i.putExtras(b); 
       startActivity(i); 

       setResult(FOTO_MODE, mIntent); 
       finish(); 

      } 
     } 
    }; 

    protected void onResume() { 
     Log.e(TAG, "onResume"); 
     super.onResume(); 
    } 

    protected void onSaveInstanceState(Bundle outState) { 
     super.onSaveInstanceState(outState); 
    } 

    protected void onStop() { 
     Log.e(TAG, "onStop"); 
     super.onStop(); 
    } 

    public void surfaceCreated(SurfaceHolder holder) { 
     Log.e(TAG, "surfaceCreated"); 
     mCamera = Camera.open(); 

    } 

    public void surfaceChanged(SurfaceHolder holder, int format, int w, int h) { 
     Log.e(TAG, "surfaceChanged"); 

     // XXX stopPreview() will crash if preview is not running 
     if (mPreviewRunning) { 
      mCamera.stopPreview(); 
     } 

     Camera.Parameters p = mCamera.getParameters(); 
     p.setPreviewSize(w, h); 
     mCamera.setParameters(p); 
     try { 
      mCamera.setPreviewDisplay(holder); 
     } catch (IOException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 
     mCamera.startPreview(); 
     mPreviewRunning = true; 
    } 

    public void surfaceDestroyed(SurfaceHolder holder) { 
     Log.e(TAG, "surfaceDestroyed"); 
     mCamera.stopPreview(); 
     mPreviewRunning = false; 
     mCamera.release(); 
    } 

    private SurfaceView mSurfaceView; 
    private SurfaceHolder mSurfaceHolder; 

    public void onClick(View arg0) { 

     mCamera.takePicture(null, mPictureCallback, mPictureCallback); 

    } 

    public static boolean StoreByteImage(Context mContext, byte[] imageData, int quality, String expName) { 

     File sdImageMainDirectory = new File("/sdcard"); 
     FileOutputStream fileOutputStream = null; 
     String nameFile; 
     try { 

      BitmapFactory.Options options=new BitmapFactory.Options(); 
      options.inSampleSize = 5; 
      Bitmap myImage = BitmapFactory.decodeByteArray(imageData, 0, imageData.length,options); 
      fileOutputStream = new FileOutputStream(sdImageMainDirectory.toString() +"/image.jpg"); 
      BufferedOutputStream bos = new BufferedOutputStream(fileOutputStream); 

      myImage.compress(CompressFormat.JPEG, quality, bos); 

      bos.flush(); 
      bos.close(); 

     } catch (FileNotFoundException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } catch (IOException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 

     return true; 
    } 

} 

我張貼我的佈局並在這裏顯示...

佈局editphoto.xml

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:orientation="vertical" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
    > 
<SurfaceView 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
    android:id="@+id/surface_camera" 
    /> 
</LinearLayout> 

和清單文件......

<?xml version="1.0" encoding="utf-8"?> 
<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
     package="x.y" 
     android:versionCode="1" 
     android:versionName="1.0"> 
    <application android:icon="@drawable/icon" android:label="@string/app_name"> 
     <activity android:name=".EditPhoto" 
        android:label="@string/app_name"> 
      <intent-filter> 
       <action android:name="android.intent.action.MAIN" /> 
       <category android:name="android.intent.category.LAUNCHER" /> 
      </intent-filter> 
     </activity> 

    <activity android:name="ImageDisplayActivity"></activity> 
</application> 


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

</manifest> 

新的活動來顯示圖像ImageDisplayActivity.java(圖片會顯示在您會點擊表面觀)....

package x.y; 

import android.app.Activity; 
import android.graphics.Bitmap; 
import android.graphics.BitmapFactory; 
import android.os.Bundle; 
import android.widget.ImageView; 

public class ImageDisplayActivity extends Activity { 

    public void onCreate(Bundle icicle) { 
     super.onCreate(icicle); 
     Bundle extras = getIntent().getExtras(); 
     setContentView(R.layout.anotherlayout); 

     BitmapFactory.Options options=new BitmapFactory.Options(); 
     options.inSampleSize = 5; 
     byte[] imageData = extras.getByteArray("imageData"); 
     Bitmap myImage = BitmapFactory.decodeByteArray(imageData , 0, imageData.length,options); 


     ImageView imageView = (ImageView) findViewById(R.id.myPic); 
     imageView.setImageBitmap(myImage); 
    } 
} 

,它的佈局otherlayout.xml ...

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:orientation="vertical" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
    > 
<ImageView 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
    android:layout_gravity="center" 
    android:id="@+id/myPic" 
    /> 
</LinearLayout> 
+0

@通緝,我正在做類似的事情,但情況並非如此。你可以看看我的代碼@ http://stackoverflow.com/questions/6861820/saving-picture-to-a-file-and-retrieving-it/6861866#6861866。我真的很感激。 – Kgrover