2014-10-28 89 views
2

我正在練習構建Android應用程序,並開始使用手電筒將是一個很好的初學者步驟。在我的代碼被炸燬數次後,我的應用程序穩定在不再強制關閉的位置。火炬/手電筒無法啓動Android應用程序

但是,LED照相機閃光燈不能打開,就像我希望它應該。

任何有關我在做什麼錯誤的見解將是最有幫助的。

public class PMATorch extends Activity { 

private Camera camera; 
private Button button; 
private Camera.Parameters param; 
private boolean torchStat = false; 
public Camera getCameraInstance() { 
    Camera c = null; 
    try { 
     c = camera.open(); 
    } catch (Exception e) { 
    } 
    return c; 
} 

private void torchOn(){ 
    if (camera != null){ 
     Parameters param = camera.getParameters(); 
     param.setFlashMode(Parameters.FLASH_MODE_TORCH); 
     camera.setParameters(param); 
     camera.startPreview(); 
     torchStat = true; 
    } 
} 
private void torchOff(){ 
    if (camera != null){ 
     Parameters param = camera.getParameters(); 
     param.setFlashMode(Parameters.FLASH_MODE_OFF); 
     camera.setParameters(param); 
     camera.stopPreview(); 
     torchStat = false; 
    } 
} 

@Override 
protected void onDestroy() { 
    if (camera != null) { 
     camera.release(); 
     camera = null; 
    } 
    super.onDestroy(); 
} 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_pmatorch); 
    camera = getCameraInstance(); 
    button = (Button) findViewById(R.id.torchOnOff); 
    button.setOnClickListener(new OnClickListener() { 

     @Override 
     public void onClick(View v) { 

      if (torchStat = false) { 
       torchOn(); 

      } else { 
       torchOff(); 
      } 
     } 
    }); 
} 
} 

編輯:我有在AndroidManifest.xml中設置的權限和功能。

編輯2:更新了代碼,我剛剛嘗試運行。

回答

2
private Camera camera; 

永遠不會分配任何東西。所以if (camera != null){torchOn不會做任何事情。你可能想要做這樣的事情:

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    camera = getCameraInstance(); // << 

public Camera getCameraInstance() { 
    Camera c = null; 
    try { 
     c = camera.open(); 
    } catch (Exception e) { 
    } 
    return c; 
} 

有另外2個次要問題: * catch (Exception e) {}隱藏任何可能去錯在這裏。我會添加至少一個日誌語句,如Log.e("PMATorch", "getCameraInstance", e)。 *美容問題:camera.open()尖叫聲NullPointerException乍一看。更改爲Camera.open() - 該方法是靜態的並且屬於該類。

E.g. (IMO更好,如果你擺脫局部變量,所以我刪除了也讀)

public Camera getCameraInstance() { 
    try { 
     return Camera.open(); 
    } catch (Exception e) { 
     Log.e("PMATorch", "getCameraInstance", e); 
     return null; 
    } 
} 

若要調試這樣的問題進一步幫助。將日誌添加到實際上導致似乎不起作用的操作的位置。

private void torchOn(){ 
    if (camera != null){ 
     Log.d("PMATorch", "now actually turning on"); 
     ... 

你會發現在很多情況下你認爲不工作的代碼實際上並未執行。當發生這種情況時,可以追溯到那裏的路徑,或者使用更多的日誌,或者使用調試器並逐步執行代碼。

+1

我沒注意到那個。 :(這可能是OP的正確答案,但我認爲我的答案也提供了一些信息,所以我會保持在那裏,除非它被證明是錯誤的。 – Keale 2014-10-29 00:03:42

+0

@Keale可能,我實際上不知道如何正確使用相機:D – zapl 2014-10-29 00:04:56

+0

好的,如果你分析他的代碼,你會看到'getCameraInstance()'永遠不會被調用,所以相機將永遠是null。然後在他的torchOn()方法中檢查相機是否存在,所以如果相機爲空,他的空檢查將工作,所以燈不會打開。你必須是一個非常有經驗的程序員注意到> _ < – Keale 2014-10-29 00:07:07

2

而不是使用Parameters.FLASH_MODE_ON,請嘗試在您的torchOn()方法上使用Parameters.FLASH_MODE_TORCH

按照documentation對相機參數

Parameters.FLASH_MODE_ON:Flash將永遠快照期間被解僱。
Parameters.FLASH_MODE_TORCH:在預覽,自動對焦和快照期間持續發光。

根據我的理解,使用Parameters.FLASH_MODE_ON只會一次性打開指示燈,或者僅在拍攝照片時纔打開指示燈。 Parameters.FLASH_MODE_TORCH不斷發光,所以這個選項適合您按下按鈕時打開燈的要求。

關於創建手電筒應用程序的一個很好的教程可以找到here