2013-02-09 53 views
1

我正在試圖製作閃光燈應用程序在Galaxy Nexus上運行。我知道你需要實現SurfaceHolder.Callback。但是當我這樣做時,應用程序正在編譯和運行,沒有任何錯誤。但是,LED根本沒有打開,並且在按下切換按鈕3次後應用程序崩潰。閃光燈android應用程序崩潰後,按下切換按鈕3次,並且LED從未打開

public class MainActivity extends Activity implements SurfaceHolder.Callback { 
Camera cam; 
public static SurfaceHolder mHolder; 
public static SurfaceView preview; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 

    preview = (SurfaceView) findViewById(R.id.PREVIEW); 
    mHolder = preview.getHolder(); 
    cam = Camera.open(); 
    try { 
     cam.setPreviewDisplay(mHolder); 
    } catch (IOException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 


    ToggleButton toggle = (ToggleButton) findViewById(R.id.toggleButton1); 
    final TextView text = (TextView) findViewById(R.id.textView1); 
    text.setText("Flash Light"); 

    toggle.setOnCheckedChangeListener(new OnCheckedChangeListener() { 

     @Override 
     public void onCheckedChanged(CompoundButton buttonView, 
       boolean isChecked) { 
      // TODO Auto-generated method stub 


      if(isChecked) { 

       text.setText("Flash Light is ON"); 
       Parameters p = cam.getParameters(); 
       p.setFlashMode(Parameters.FLASH_MODE_TORCH); 
       cam.setParameters(p); 
       cam.startPreview(); 

      } else { 

       text.setText("Flash Light is OFF"); 
       Parameters p = cam.getParameters(); 
       p.setFlashMode(Parameters.FLASH_MODE_OFF); 
       cam.setParameters(p); 
       cam.stopPreview(); 
       cam.release(); 

      } 

     } 

    }); 


} 

@Override 
public boolean onCreateOptionsMenu(Menu menu) { 
    // Inflate the menu; this adds items to the action bar if it is present. 
    getMenuInflater().inflate(R.menu.activity_main, menu); 
    return true; 
} 

@Override 
public void surfaceChanged(SurfaceHolder arg0, int arg1, int arg2, int arg3) { 
    // TODO Auto-generated method stub 

} 

@Override 
public void surfaceCreated(SurfaceHolder holder) { 
    // TODO Auto-generated method stub 
    mHolder = holder; 
    try { 
     cam.setPreviewDisplay(mHolder); 
    } catch (IOException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 

} 

@Override 
public void surfaceDestroyed(SurfaceHolder arg0) { 
    // TODO Auto-generated method stub 
    cam.stopPreview(); 
    mHolder = null; 

} 
} 

編輯:清單

<?xml version="1.0" encoding="utf-8"?> 
<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
    package="com.example.flashlight" 
    android:versionCode="1" 
    android:versionName="1.0" > 

    <uses-sdk 
     android:minSdkVersion="14" 
     android:targetSdkVersion="17" /> 

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

    <application 
     android:allowBackup="true" 
     android:icon="@drawable/ic_launcher" 
     android:label="@string/app_name" 
     android:theme="@style/AppTheme" android:debuggable="true"> 
     <activity 
      android:name="com.example.flashlight.MainActivity" 
      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> 

</manifest> 

ANSWERED

我想通了,在activity_main.xml中,我需要我的SurfaceView下添加的最後一行:

activity_main .xml

<SurfaceView 
android:id="@+id/PREVIEW" 
android:layout_width="1dip" 
android:layout_height="1dip" 
android:visibility="visible" /> 
+0

也把你的清單。 – Hosein 2013-02-09 06:30:41

+0

即時通訊對不起,我不知道如何將清單從主要活動中分離出來。但我仍然加了它。 – flash 2013-02-09 06:41:43

+0

我爲你編輯它。 – Hosein 2013-02-09 06:44:46

回答

0

檢查flashModes是否可用。並且還可以讓你在方向改變時丟失相機實例。

public static void FlashOn(Camera mCamera) 
    { 
     //Get Camera Params for customisation 
     Camera.Parameters parameters = mCamera.getParameters(); 

     //Check Whether device supports AutoFlash, If you YES then set AutoFlash 
     List<String> flashModes = parameters.getSupportedFlashModes(); 
     if (flashModes.contains(android.hardware.Camera.Parameters.FLASH_MODE_TORCH)) 
     { 
      parameters.setFlashMode(Parameters.FLASH_MODE_TORCH); 
     } 
     else if(flashModes.contains(Parameters.FLASH_MODE_ON)) 
     { 
      parameters.setFlashMode(Parameters.FLASH_MODE_ON); 
     } 
     mCamera.setParameters(parameters); 
     mCamera.startPreview(); 
    } 

    public static void FlashOff(Camera mCamera) 
    { 
     //Get Camera Params for customisation 
     Camera.Parameters parameters = mCamera.getParameters(); 

     //Check Whether device supports AutoFlash, If you YES then set AutoFlash 
     List<String> flashModes = parameters.getSupportedFlashModes(); 
     if (flashModes.contains(android.hardware.Camera.Parameters.FLASH_MODE_OFF)) 
     { 
      parameters.setFlashMode(Parameters.FLASH_MODE_OFF); 
     } 
     mCamera.setParameters(parameters); 
     mCamera.startPreview(); 
    } 
相關問題