2013-02-01 5 views
0

Je construis une application de la caméra pour Android, en essayant d'apprendre comment. J'ai suivi un tutoriel, mais il continue d'échouer et force ferme. S'il vous plaît jeter un oeil à mes détails ci-dessous:Application Android caméra force fermer

Code 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" android:id="@+id/layout"> 
<TextView android:layout_width="fill_parent" 
    android:layout_height="wrap_content" android:text="Camera Demo" 
    android:textSize="24sp" /> 

<FrameLayout android:id="@+id/preview" 
    android:layout_weight="1" android:layout_width="fill_parent" 
    android:layout_height="fill_parent"> 
</FrameLayout> 

<Button android:layout_width="wrap_content" 
    android:layout_height="wrap_content" android:id="@+id/buttonClick" 
    android:text="Click" android:layout_gravity="center"></Button> 

</LinearLayout> 

code Java:

public class CameraActivity extends Activity { 
private static final String TAG = "CameraDemo"; 
Camera camera; 
Preview preview; 
Button buttonClick; 

/** Called when the activity is first created. */ 
@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.camera_screen); 

    preview = new Preview(this); 
    ((FrameLayout) findViewById(R.id.preview)).addView(preview); 

    buttonClick = (Button) findViewById(R.id.buttonClick); 
    buttonClick.setOnClickListener(new OnClickListener() { 
     public void onClick(View v) { 
      preview.camera.takePicture(shutterCallback, rawCallback, 
        jpegCallback); 
     } 
    }); 

    Log.d(TAG, "onCreate'd"); 
} 

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

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

/** Handles data for jpeg picture */ 
PictureCallback jpegCallback = new PictureCallback() { 
    public void onPictureTaken(byte[] data, Camera camera) { 
     FileOutputStream outStream = null; 
     try { 
      // write to local sandbox file system 
      // outStream = 
      // CameraDemo.this.openFileOutput(String.format("%d.jpg", 
      // System.currentTimeMillis()), 0); 
      // Or write to sdcard 
      outStream = new FileOutputStream(String.format(
        "/sdcard/%d.jpg", System.currentTimeMillis())); 
      outStream.write(data); 
      outStream.close(); 
      Log.d(TAG, "onPictureTaken - wrote bytes: " + data.length); 
     } catch (FileNotFoundException e) { 
      e.printStackTrace(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } finally { 
     } 
     Log.d(TAG, "onPictureTaken - jpeg"); 
    } 
}; 

} 

Preview.java:

class Preview extends SurfaceView implements SurfaceHolder.Callback { 
private static final String TAG = "Preview"; 

SurfaceHolder mHolder; 
public Camera camera; 

Preview(Context context) { 
    super(context); 

    // Install a SurfaceHolder.Callback so we get notified when the 
    // underlying surface is created and destroyed. 
    mHolder = getHolder(); 
    mHolder.addCallback(this); 
    mHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS); 
} 

public void surfaceCreated(SurfaceHolder holder) { 
    // The Surface has been created, acquire the camera and tell it where 
    // to draw. 
    camera = Camera.open(); 
    try { 
     camera.setPreviewDisplay(holder); 

     camera.setPreviewCallback(new PreviewCallback() { 

      public void onPreviewFrame(byte[] data, Camera arg1) { 
       FileOutputStream outStream = null; 
       try { 
        outStream = new FileOutputStream(String.format(
          "/sdcard/%d.jpg", System.currentTimeMillis())); 
        outStream.write(data); 
        outStream.close(); 
        Log.d(TAG, "onPreviewFrame - wrote bytes: " 
          + data.length); 
       } catch (FileNotFoundException e) { 
        e.printStackTrace(); 
       } catch (IOException e) { 
        e.printStackTrace(); 
       } finally { 
       } 
       Preview.this.invalidate(); 
      } 
     }); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 
} 

public void surfaceDestroyed(SurfaceHolder holder) { 
    // Surface will be destroyed when we return, so stop the preview. 
    // Because the CameraDevice object is not a shared resource, it's very 
    // important to release it when the activity is paused. 
    camera.stopPreview(); 
    camera = null; 
} 

public void surfaceChanged(SurfaceHolder holder, int format, int w, int h) { 
    // Now that the size is known, set up the camera parameters and begin 
    // the preview. 
    Camera.Parameters parameters = camera.getParameters(); 
    parameters.setPreviewSize(w, h); 
    camera.setParameters(parameters); 
    camera.startPreview(); 
} 

@Override 
public void draw(Canvas canvas) { 
    super.draw(canvas); 
    Paint p = new Paint(Color.RED); 
    Log.d(TAG, "draw"); 
    canvas.drawText("PREVIEW", canvas.getWidth()/2, 
      canvas.getHeight()/2, p); 
} 
} 

Logcat:

02-01 19:44:41.825: E/AndroidRuntime(4329): FATAL EXCEPTION: main 
02-01 19:44:41.825: E/AndroidRuntime(4329): java.lang.RuntimeException: setParameters failed 
02-01 19:44:41.825: E/AndroidRuntime(4329):  at android.hardware.Camera.native_setParameters(Native Method) 
02-01 19:44:41.825: E/AndroidRuntime(4329):  at android.hardware.Camera.setParameters(Camera.java:1527) 
02-01 19:44:41.825: E/AndroidRuntime(4329):  at com.mysoftware.mysoftwareos.mobile.Preview.surfaceChanged(Preview.java:78) 
02-01 19:44:41.825: E/AndroidRuntime(4329):  at android.view.SurfaceView.updateWindow(SurfaceView.java:554) 
02-01 19:44:41.825: E/AndroidRuntime(4329):  at android.view.SurfaceView.access$000(SurfaceView.java:81) 
02-01 19:44:41.825: E/AndroidRuntime(4329):  at android.view.SurfaceView$3.onPreDraw(SurfaceView.java:169) 
02-01 19:44:41.825: E/AndroidRuntime(4329):  at android.view.ViewTreeObserver.dispatchOnPreDraw(ViewTreeObserver.java:671) 
02-01 19:44:41.825: E/AndroidRuntime(4329):  at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1848) 
02-01 19:44:41.825: E/AndroidRuntime(4329):  at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1028) 
02-01 19:44:41.825: E/AndroidRuntime(4329):  at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:4246) 
02-01 19:44:41.825: E/AndroidRuntime(4329):  at android.view.Choreographer$CallbackRecord.run(Choreographer.java:725) 
02-01 19:44:41.825: E/AndroidRuntime(4329):  at android.view.Choreographer.doCallbacks(Choreographer.java:555) 
02-01 19:44:41.825: E/AndroidRuntime(4329):  at android.view.Choreographer.doFrame(Choreographer.java:525) 
02-01 19:44:41.825: E/AndroidRuntime(4329):  at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:711) 
02-01 19:44:41.825: E/AndroidRuntime(4329):  at android.os.Handler.handleCallback(Handler.java:615) 
02-01 19:44:41.825: E/AndroidRuntime(4329):  at android.os.Handler.dispatchMessage(Handler.java:92) 
02-01 19:44:41.825: E/AndroidRuntime(4329):  at android.os.Looper.loop(Looper.java:137) 
02-01 19:44:41.825: E/AndroidRuntime(4329):  at android.app.ActivityThread.main(ActivityThread.java:4765) 
02-01 19:44:41.825: E/AndroidRuntime(4329):  at java.lang.reflect.Method.invokeNative(Native Method) 
02-01 19:44:41.825: E/AndroidRuntime(4329):  at java.lang.reflect.Method.invoke(Method.java:511) 
02-01 19:44:41.825: E/AndroidRuntime(4329):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:786) 
02-01 19:44:41.825: E/AndroidRuntime(4329):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553) 
02-01 19:44:41.825: E/AndroidRuntime(4329):  at dalvik.system.NativeStart.main(Native Method) 
02-01 19:44:45.455: E/Trace(4386): error opening trace file: No such file or directory (2) 
02-01 19:44:45.585: E/PhonePolicy(4386): Could not preload class for phone policy: com.android.internal.policy.impl.PhoneWindow$ContextMenuCallback 

S'il vous plaît aidez-moi et merci beaucoup!

Répondre

2

Vous ne disposez pas de la source de la classe Preview affichée, il est donc très difficile de dire ce qui ne va pas. Mais à partir de la trace, l'erreur provient d'un appel Camera.setParameters() de Preview.surfaceChanged. Donc la question est, qu'est-ce que vous essayez d'établir là-bas que l'appareil photo n'aime pas? En outre, votre journal ne couvre que l'exception, donc il n'y a pas de contexte sur ce que le système faisait juste avant votre panne. Y compris un peu du journal avant l'échec serait très utile pour le débogage aussi; le système imprime souvent une raison pour laquelle l'appel a échoué quelques lignes avant la trace de la pile. Edit: Maintenant avec Preview.java là, je peux voir le problème.

Vous ne pouvez pas choisir une taille aléatoire pour la sortie d'aperçu de la caméra. Il doit être l'un des tailles d'aperçu fournies par getSupportedPreviewSizes(). À l'heure actuelle, vous utilisez simplement la taille de la surface pour la sortie de prévisualisation, ce qui n'est pas garanti du tout (vous pourriez avoir de la chance si la taille correspond à celle de la liste, mais c'est peu probable).

Jetez un oeil à la camera app tutorial sur le site du développeur Android; il essaie de couvrir certains de ces détails.

+0

J'ai téléchargé la classe d'aperçu si vous pouviez y jeter un coup d'œil – user1446632