2013-02-09 3 views
1

Я пытаюсь сделать приложение для вспышки для работы на галактике Nexus. Я знаю, что вам нужно реализовать SurfaceHolder.Callback. Но когда я это делаю, приложение компилируется и работает без ошибок. Но тогда светодиод не включается вообще, и приложение падает после нажатия кнопки переключения 3 раза.Вспышка вспышки Android падает после нажатия кнопки переключения 3 раза, а светодиод никогда не включается

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; 

} 
} 

EDIT: Manifest

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

ОТВЕТИЛ:

Я понял, что в 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

+0

Мне жаль, я не знал, как отделить манифест от основной деятельности. но я добавил его, тем не менее. – flash

+0

Я редактирую его для вас. – Hosein

ответ

0

Проверьте, доступны ли flashModes или нет. А также сделайте вас Camera mCamera static, иначе при смене ориентации он теряет камеру.

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(); 
    } 

 Смежные вопросы

  • Нет связанных вопросов^_^