2014-07-25 45 views
1

我正在嘗試爲本地音樂會開發手電筒應用程序。這是一個更大的應用程序的一部分,因此它在一個片段中。這是代碼:Android片段中的手電筒 - SurfaceView

首先我聲明的類與它的變量一起:

public class ConcertFragment extends Fragment { 

    ToggleButton btnFlashlight; 
    View rootView; 

    private Camera cam; 
    private boolean hasFlash; 
    boolean hasCamera; 
    boolean isFlashOn; 
    Parameters params; 

    public ConcertFragment() { 
    } 

接下來是onActivityCreated方法,它返回對getCamera方法(聲明進一步下降):

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

     getCamera(); 
    } 

然後我創建onCreateView構建佈局的方法:

@Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 

     rootView = inflater.inflate(R.layout.fragment_concert, container, false); 

     hasFlash = getActivity().getApplicationContext().getPackageManager().hasSystemFeature(PackageManager.FEATURE_CAMERA_FLASH); 

     if (!hasFlash) { 
      // device doesn't support flash 
      // Show alert message and close the application 
      AlertDialog alert = new AlertDialog.Builder(getActivity()).create(); 

      alert.setTitle("No Flash"); 
      alert.setMessage("Sorry, device is not flash supported."); 
      alert.setButton(DialogInterface.BUTTON_POSITIVE, "OK", new android.content.DialogInterface.OnClickListener() { 
       @Override 
       public void onClick(DialogInterface dialog, int which) { 

       } 
      }); 
      alert.show(); 
     } 

     btnFlashlight = (ToggleButton) rootView.findViewById(R.id.toggleButton); 
     btnFlashlight.setOnCheckedChangeListener(new OnCheckedChangeListener() { 

      @Override 
      public void onCheckedChanged(CompoundButton buttonView, 
        boolean isChecked) { 
       if (isFlashOn) { 
        // turn off flash 
        turnOffFlash(); 
       } else { 
        // turn on flash 
        turnOnFlash(); 
       } 
      } 
     }); 

     return rootView; 
    } 

方法以接通閃光:

private void turnOnFlash() { 
     if (!isFlashOn) { 
      if (cam == null || params == null) { 
       return; 
      } 

      params = cam.getParameters(); 
      params.setFlashMode(Parameters.FLASH_MODE_TORCH); 
      cam.setParameters(params); 
      cam.startPreview(); 
      isFlashOn = true; 

      // changing button/switch image 
      toggleButtonImage(); 
     } 
    } 

方法關閉閃光燈:

private void turnOffFlash() { 
     if (isFlashOn) { 
      if (cam == null || params == null) { 
       return; 
      } 

      params = cam.getParameters(); 
      params.setFlashMode(Parameters.FLASH_MODE_OFF); 
      cam.setParameters(params); 
      cam.stopPreview(); 
      isFlashOn = false; 

      // changing button/switch image 
      toggleButtonImage(); 
     } 
    } 

方法來設置相機參數:

 private void getCamera() { 
      if (cam != null) { 
       try { 
        cam = Camera.open(); 
        params = cam.getParameters(); 
        cam.startPreview(); 
        hasCamera = true; 

       } catch (RuntimeException e) { 
        Log.e("Camera Error. Failed to Open. Error: ", e.getMessage()); 
       } 
      } 
     }   

     private void toggleButtonImage(){ 
      if(isFlashOn){ 
       btnFlashlight.setBackgroundResource(R.drawable.btn_switch_on); 
      }else{ 
       btnFlashlight.setBackgroundResource(R.drawable.btn_switch_off); 
      } 
     } 
    } 
} 

手電筒開關切換按鈕開關打開和關閉,但手電筒從未開啓我的Nexus 5背面。

我正在使用的相關權限如下:

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

任何人都可以幫忙嗎?

+1

你會介意剝離你的代碼,只顯示相關部分的代碼?它真的很長。 –

+0

好的,我會評論它。 –

+0

有沒有人發現任何關於如何解決這個問題?任何幫助表示讚賞:) –

回答

3

我也在努力解決同樣的問題。您需要在佈局中添加SurfacePreview您的按鈕上方:

<SurfaceView 
    android:id="@+id/PREVIEW" 
    android:layout_width="1dp" 
    android:layout_height="1dp"/> 

,目前我的片段是這樣的:

public class FlashlightFragment extends Fragment implements SurfaceHolder.Callback { 

ImageButton btnSwitch; 
//flag to detect flash is on or off 
private boolean isLighOn = false; 

private Camera camera; 
Parameters params; 

@Override 
public void onStart() { 
    super.onStart(); 
    SurfaceView preview = (SurfaceView)getView().findViewById(R.id.PREVIEW); 
    SurfaceHolder mHolder = preview.getHolder(); 
    mHolder.addCallback(this); 
} 

@Override 
public void onPause(){ 
    super.onPause(); 
    turnOffFlash(); 
} 

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, 
         Bundle savedInstanceState) { 
    View view = inflater.inflate(R.layout.flashlight_fragment, 
      container, false); 

    // flash switch button 
    btnSwitch = (ImageButton) view.findViewById(R.id.flashlight_button); 

    // displaying button image 
    toggleButtonImage(); 

    // Switch button click event to toggle flash on/off 
    btnSwitch.setOnClickListener(new View.OnClickListener() { 

     @Override 
     public void onClick(View v) { 
      if (isLighOn) { 
       // turn off flash 
       turnOffFlash(); 
      } else { 
       // turn on flash 
       turnOnFlash(); 
      } 
     } 
    }); 

    return view; 
} 

// Turning On flash 
private void turnOnFlash() { 

    if (!isLighOn) { 
     if (camera == null || params == null) { 
      return; 
     } 
     params = camera.getParameters(); 
     params.setFlashMode(Parameters.FLASH_MODE_TORCH); 
     camera.setParameters(params); 
     camera.startPreview(); 
     isLighOn = true; 

     // changing button/switch image 
     toggleButtonImage(); 
    } 

} 

// Turning Off flash 
private void turnOffFlash() { 

    if (isLighOn) { 
     if (camera == null || params == null) { 
      return; 
     } 

     params = camera.getParameters(); 
     params.setFlashMode(Parameters.FLASH_MODE_OFF); 
     camera.setParameters(params); 
     camera.stopPreview(); 
     isLighOn = false; 

     // changing button/switch image 
     toggleButtonImage(); 
    } 
} 

/* 
* Toggle switch button images 
* changing image states to on/off 
* */ 
private void toggleButtonImage(){ 
    if(isLighOn){ 
     btnSwitch.setImageResource(R.drawable.icon_bulb_on); 
    }else{ 
     btnSwitch.setImageResource(R.drawable.icon_bulb_off); 
    } 
} 

@Override 
public void surfaceChanged(SurfaceHolder holder,int format,int width,int height) { 

} 

@Override 
public void surfaceDestroyed(SurfaceHolder holder) { 
    if (camera != null) { 
     camera.stopPreview(); 
     camera.setPreviewCallback(null); 
     camera.release(); 
     camera = null; 
    } 
} 

@Override 
public void surfaceCreated(SurfaceHolder holder) { 
    if (camera == null) { 
     camera = Camera.open(); 
     params = camera.getParameters(); 
     try { 
      camera.setPreviewDisplay(holder); 
     } catch (IOException e) { 
      camera.release(); 
      camera = null; 
     } 
    } 
} 

這似乎對我的Nexus 5做工精細,但力量上的Xperia關閉Z在camera.setPreviewDisplay(mHolder);我還沒有能夠解決這個問題呢。

希望這會有所幫助。

+0

嗨@尼爾斯,我會試試看,並會回覆你。 –

+0

感謝Neils,它工作:)我會更新這個相同的帖子,如果我設法讓它在Android操作系統上全局工作,而不僅僅是在我的Nexus 5上。同時你可以給我們發送帶有錯誤的LogCat在你的Xperia上? –

+0

偉大的工作,似乎現在正在xperia上工作,我想這是自定義ROM有關的東西。 –