2011-12-20 23 views
1

我對Android非常陌生。我正嘗試使用具有圖像疊加層的相機。我已經看到很多討論這個話題的線索,但他們仍然有點頭大。這裏是我的活動:我使用相機的代碼有什麼問題?

package com.commonsware.android.skeleton; 

import android.app.Activity; 
import android.content.Context; 
import android.hardware.Camera; 
import android.hardware.Camera.Size; 
import android.os.Bundle; 
import android.view.SurfaceHolder; 
import android.view.SurfaceView; 
import android.view.Window; 
import android.widget.FrameLayout; 
import java.io.IOException; 
import java.util.List; 

// ---------------------------------------------------------------------- 

public class SimpleBulbActivity extends Activity { 
    private Preview mPreview; 
    FrameLayout preview; 

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

     // Hide the window title. 
     requestWindowFeature(Window.FEATURE_NO_TITLE); 
     setContentView(R.layout.main); 
    } 

    protected void onResume() { 
     //Setup the FrameLayout with the Camera Preview Screen 
     mPreview = new Preview(this); 
     preview = (FrameLayout)findViewById(R.id.preview); 
     preview.addView(mPreview); 
    } 

} 

// ---------------------------------------------------------------------- 

class Preview extends SurfaceView implements SurfaceHolder.Callback { 
    SurfaceHolder mHolder; 
    Camera mCamera; 

    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. 
     mCamera = Camera.open(); 
     try { 
      mCamera.setPreviewDisplay(holder); 
     } catch (IOException exception) { 
      mCamera.release(); 
      mCamera = null; 
      // TODO: add more exception handling logic here 
     } 
    } 

    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. 
     mCamera.stopPreview(); 
     mCamera.release(); 
     mCamera = null; 
    } 


    private Size getOptimalPreviewSize(List<Size> sizes, int w, int h) { 
     final double ASPECT_TOLERANCE = 0.05; 
     double targetRatio = (double) w/h; 
     if (sizes == null) return null; 

     Size optimalSize = null; 
     double minDiff = Double.MAX_VALUE; 

     int targetHeight = h; 

     // Try to find an size match aspect ratio and size 
     for (Size size : sizes) { 
      double ratio = (double) size.width/size.height; 
      if (Math.abs(ratio - targetRatio) > ASPECT_TOLERANCE) continue; 
      if (Math.abs(size.height - targetHeight) < minDiff) { 
       optimalSize = size; 
       minDiff = Math.abs(size.height - targetHeight); 
      } 
     } 

     // Cannot find the one match the aspect ratio, ignore the requirement 
     if (optimalSize == null) { 
      minDiff = Double.MAX_VALUE; 
      for (Size size : sizes) { 
       if (Math.abs(size.height - targetHeight) < minDiff) { 
        optimalSize = size; 
        minDiff = Math.abs(size.height - targetHeight); 
       } 
      } 
     } 
     return optimalSize; 
    } 

    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 = mCamera.getParameters(); 

     List<Size> sizes = parameters.getSupportedPreviewSizes(); 
     Size optimalSize = getOptimalPreviewSize(sizes, w, h); 
     parameters.setPreviewSize(optimalSize.width, optimalSize.height); 

     mCamera.setParameters(parameters); 
     mCamera.startPreview(); 
    } 

} 

正如你所看到的,我使用預覽類的可以在文檔中發現的CameraPreview例子。這是我的佈局:

<?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> 

所以我正在做的是創建表面,然後試圖將其添加到預覽FrameLayout內的佈局。雖然它不工作。它馬上崩潰。幫助將會很棒!

這裏是我的清單:

<?xml version="1.0" encoding="utf-8"?> 
<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
     package="com.commonsware.android.skeleton" 
     android:versionCode="1" 
     android:versionName="1.0"> 
    <uses-sdk android:minSdkVersion="8" /> 

    <application android:icon="@drawable/icon" android:label="@string/app_name"> 
     <activity android:name=".SimpleBulbActivity" 
        android:label="@string/app_name"> 
      <intent-filter> 
       <action android:name="android.intent.action.MAIN" /> 
       <category android:name="android.intent.category.LAUNCHER" /> 
      </intent-filter> 
     </activity> 

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

道歉,這裏是整個logcat的。我在那裏看到兩個例外,所以也許這是造成它的原因?

12-20 16:16:10.843: ERROR/BatteryService(68): usbOnlinePath not found 
12-20 16:16:10.843: ERROR/BatteryService(68): batteryVoltagePath not found 
12-20 16:16:10.843: ERROR/BatteryService(68): batteryTemperaturePath not found 
12-20 16:16:10.883: ERROR/SurfaceFlinger(68): Couldn't open /sys/power/wait_for_fb_sleep or /sys/power/wait_for_fb_wake 
12-20 16:16:11.003: ERROR/SensorService(68): couldn't open device for module sensors (Invalid argument) 
12-20 16:16:15.923: ERROR/System(68): Failure starting core service 
12-20 16:16:15.923: ERROR/System(68): java.lang.SecurityException 
12-20 16:16:15.923: ERROR/System(68):  at android.os.BinderProxy.transact(Native Method) 
12-20 16:16:15.923: ERROR/System(68):  at android.os.ServiceManagerProxy.addService(ServiceManagerNative.java:146) 
12-20 16:16:15.923: ERROR/System(68):  at android.os.ServiceManager.addService(ServiceManager.java:72) 
12-20 16:16:15.923: ERROR/System(68):  at com.android.server.ServerThread.run(SystemServer.java:206) 
12-20 16:16:15.953: ERROR/EventHub(68): could not get driver version for /dev/input/mouse0, Not a typewriter 
12-20 16:16:15.953: ERROR/EventHub(68): could not get driver version for /dev/input/mice, Not a typewriter 
12-20 16:16:16.564: ERROR/SoundPool(68): error loading /system/media/audio/ui/Effect_Tick.ogg 
12-20 16:16:16.564: ERROR/SoundPool(68): error loading /system/media/audio/ui/KeypressStandard.ogg 
12-20 16:16:16.564: ERROR/SoundPool(68): error loading /system/media/audio/ui/KeypressSpacebar.ogg 
12-20 16:16:16.564: ERROR/SoundPool(68): error loading /system/media/audio/ui/KeypressDelete.ogg 
12-20 16:16:16.564: ERROR/SoundPool(68): error loading /system/media/audio/ui/KeypressReturn.ogg 
12-20 16:16:16.623: ERROR/UsbObserver(68): java.lang.NullPointerException 
12-20 16:16:16.623: ERROR/UsbObserver(68):  at com.android.server.UsbObserver.init(UsbObserver.java:131) 
12-20 16:16:16.623: ERROR/UsbObserver(68):  at com.android.server.UsbObserver.<init>(UsbObserver.java:65) 
12-20 16:16:16.623: ERROR/UsbObserver(68):  at com.android.server.ServerThread.run(SystemServer.java:402) 
12-20 16:16:17.233: ERROR/ThrottleService(68): Could not open GPS configuration file /etc/gps.conf 
12-20 16:16:20.224: ERROR/logwrapper(160): executing /system/bin/tc failed: No such file or directory 
12-20 16:16:20.324: ERROR/logwrapper(162): executing /system/bin/tc failed: No such file or directory 
12-20 16:16:20.394: ERROR/logwrapper(163): executing /system/bin/tc failed: No such file or directory 
12-20 16:16:58.542: ERROR/AndroidRuntime(326): FATAL EXCEPTION: main 
12-20 16:16:58.542: ERROR/AndroidRuntime(326): java.lang.RuntimeException: Unable to resume activity {com.commonsware.android.skeleton/com.commonsware.android.skeleton.SimpleBulbActivity}: android.app.SuperNotCalledException: Activity {com.commonsware.android.skeleton/com.commonsware.android.skeleton.SimpleBulbActivity} did not call through to super.onResume() 
12-20 16:16:58.542: ERROR/AndroidRuntime(326):  at android.app.ActivityThread.performResumeActivity(ActivityThread.java:2095) 
12-20 16:16:58.542: ERROR/AndroidRuntime(326):  at android.app.ActivityThread.handleResumeActivity(ActivityThread.java:2110) 
12-20 16:16:58.542: ERROR/AndroidRuntime(326):  at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1643) 
12-20 16:16:58.542: ERROR/AndroidRuntime(326):  at android.app.ActivityThread.access$1500(ActivityThread.java:117) 
12-20 16:16:58.542: ERROR/AndroidRuntime(326):  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:928) 
12-20 16:16:58.542: ERROR/AndroidRuntime(326):  at android.os.Handler.dispatchMessage(Handler.java:99) 
12-20 16:16:58.542: ERROR/AndroidRuntime(326):  at android.os.Looper.loop(Looper.java:123) 
12-20 16:16:58.542: ERROR/AndroidRuntime(326):  at android.app.ActivityThread.main(ActivityThread.java:3647) 
12-20 16:16:58.542: ERROR/AndroidRuntime(326):  at java.lang.reflect.Method.invokeNative(Native Method) 
12-20 16:16:58.542: ERROR/AndroidRuntime(326):  at java.lang.reflect.Method.invoke(Method.java:507) 
12-20 16:16:58.542: ERROR/AndroidRuntime(326):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839) 
12-20 16:16:58.542: ERROR/AndroidRuntime(326):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597) 
12-20 16:16:58.542: ERROR/AndroidRuntime(326):  at dalvik.system.NativeStart.main(Native Method) 
12-20 16:16:58.542: ERROR/AndroidRuntime(326): Caused by: android.app.SuperNotCalledException: Activity {com.commonsware.android.skeleton/com.commonsware.android.skeleton.SimpleBulbActivity} did not call through to super.onResume() 
12-20 16:16:58.542: ERROR/AndroidRuntime(326):  at android.app.Activity.performResume(Activity.java:3835) 
12-20 16:16:58.542: ERROR/AndroidRuntime(326):  at android.app.ActivityThread.performResumeActivity(ActivityThread.java:2085) 
12-20 16:16:58.542: ERROR/AndroidRuntime(326):  ... 12 more 
12-20 16:17:19.592: ERROR/AndroidRuntime(355): FATAL EXCEPTION: main 
12-20 16:17:19.592: ERROR/AndroidRuntime(355): java.lang.RuntimeException: Unable to resume activity {com.commonsware.android.skeleton/com.commonsware.android.skeleton.SimpleBulbActivity}: android.app.SuperNotCalledException: Activity {com.commonsware.android.skeleton/com.commonsware.android.skeleton.SimpleBulbActivity} did not call through to super.onResume() 
12-20 16:17:19.592: ERROR/AndroidRuntime(355):  at android.app.ActivityThread.performResumeActivity(ActivityThread.java:2095) 
12-20 16:17:19.592: ERROR/AndroidRuntime(355):  at android.app.ActivityThread.handleResumeActivity(ActivityThread.java:2110) 
12-20 16:17:19.592: ERROR/AndroidRuntime(355):  at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1643) 
12-20 16:17:19.592: ERROR/AndroidRuntime(355):  at android.app.ActivityThread.access$1500(ActivityThread.java:117) 
12-20 16:17:19.592: ERROR/AndroidRuntime(355):  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:928) 
12-20 16:17:19.592: ERROR/AndroidRuntime(355):  at android.os.Handler.dispatchMessage(Handler.java:99) 
12-20 16:17:19.592: ERROR/AndroidRuntime(355):  at android.os.Looper.loop(Looper.java:123) 
12-20 16:17:19.592: ERROR/AndroidRuntime(355):  at android.app.ActivityThread.main(ActivityThread.java:3647) 
12-20 16:17:19.592: ERROR/AndroidRuntime(355):  at java.lang.reflect.Method.invokeNative(Native Method) 
12-20 16:17:19.592: ERROR/AndroidRuntime(355):  at java.lang.reflect.Method.invoke(Method.java:507) 
12-20 16:17:19.592: ERROR/AndroidRuntime(355):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839) 
12-20 16:17:19.592: ERROR/AndroidRuntime(355):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597) 
12-20 16:17:19.592: ERROR/AndroidRuntime(355):  at dalvik.system.NativeStart.main(Native Method) 
12-20 16:17:19.592: ERROR/AndroidRuntime(355): Caused by: android.app.SuperNotCalledException: Activity {com.commonsware.android.skeleton/com.commonsware.android.skeleton.SimpleBulbActivity} did not call through to super.onResume() 
12-20 16:17:19.592: ERROR/AndroidRuntime(355):  at android.app.Activity.performResume(Activity.java:3835) 
12-20 16:17:19.592: ERROR/AndroidRuntime(355):  at android.app.ActivityThread.performResumeActivity(ActivityThread.java:2085) 
12-20 16:17:19.592: ERROR/AndroidRuntime(355):  ... 12 more 
12-20 16:18:11.932: ERROR/AndroidRuntime(365): FATAL EXCEPTION: main 
12-20 16:18:11.932: ERROR/AndroidRuntime(365): java.lang.RuntimeException: Unable to resume activity {com.commonsware.android.skeleton/com.commonsware.android.skeleton.SimpleBulbActivity}: android.app.SuperNotCalledException: Activity {com.commonsware.android.skeleton/com.commonsware.android.skeleton.SimpleBulbActivity} did not call through to super.onResume() 
12-20 16:18:11.932: ERROR/AndroidRuntime(365):  at android.app.ActivityThread.performResumeActivity(ActivityThread.java:2095) 
12-20 16:18:11.932: ERROR/AndroidRuntime(365):  at android.app.ActivityThread.handleResumeActivity(ActivityThread.java:2110) 
12-20 16:18:11.932: ERROR/AndroidRuntime(365):  at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1643) 
12-20 16:18:11.932: ERROR/AndroidRuntime(365):  at android.app.ActivityThread.access$1500(ActivityThread.java:117) 
12-20 16:18:11.932: ERROR/AndroidRuntime(365):  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:928) 
12-20 16:18:11.932: ERROR/AndroidRuntime(365):  at android.os.Handler.dispatchMessage(Handler.java:99) 
12-20 16:18:11.932: ERROR/AndroidRuntime(365):  at android.os.Looper.loop(Looper.java:123) 
12-20 16:18:11.932: ERROR/AndroidRuntime(365):  at android.app.ActivityThread.main(ActivityThread.java:3647) 
12-20 16:18:11.932: ERROR/AndroidRuntime(365):  at java.lang.reflect.Method.invokeNative(Native Method) 
12-20 16:18:11.932: ERROR/AndroidRuntime(365):  at java.lang.reflect.Method.invoke(Method.java:507) 
12-20 16:18:11.932: ERROR/AndroidRuntime(365):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839) 
12-20 16:18:11.932: ERROR/AndroidRuntime(365):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597) 
12-20 16:18:11.932: ERROR/AndroidRuntime(365):  at dalvik.system.NativeStart.main(Native Method) 
12-20 16:18:11.932: ERROR/AndroidRuntime(365): Caused by: android.app.SuperNotCalledException: Activity {com.commonsware.android.skeleton/com.commonsware.android.skeleton.SimpleBulbActivity} did not call through to super.onResume() 
12-20 16:18:11.932: ERROR/AndroidRuntime(365):  at android.app.Activity.performResume(Activity.java:3835) 
12-20 16:18:11.932: ERROR/AndroidRuntime(365):  at android.app.ActivityThread.performResumeActivity(ActivityThread.java:2085) 
+0

請提供logcat的 – bart

+0

堆棧跟蹤沒有看到你的清單或logcat的,我只能猜測。但有一件事我可以預料會導致幾乎立即崩潰是一個SecurityException。您必須在清單中擁有「android.permission.CAMERA」權限:http://developer.android.com/reference/android/Manifest.permission.html#CAMERA – Jakar

+0

我不確定在logcat中查找什麼,但這裏有兩條似乎相關的線。 '12-20 15:24:15.282:WARN/ActivityManager(61):啓動超時已過,放棄喚醒鎖! 12-20 15:24:16.619:WARN/ActivityManager(61):HistoryRecord的活動空閒超時{406bf3e0 com.commonsware.android.skeleton/.SimpleBulbActivity} ' –

回答

2

你是不是在你的onResume()實現調用super.onResume()

Caused by: android.app.SuperNotCalledException: Activity {com.commonsware.android.skeleton/com.commonsware.android.skeleton.SimpleBulbActivity} did not call through to super.onResume()