2014-03-26 85 views
8

我有一個應用程序,它使用攝像頭功能,但其部分功能也可以在沒有攝像頭功能的情況下運行。所以我把這個放在我的清單裏。hasSystemFeature(PackageManager.FEATURE_CAMERA)對於沒有攝像頭的設備返回true

<uses-permission android:name="android.permission.CAMERA" /> 
<uses-feature android:name="android.hardware.camera" android:required="false"/> 

,並在我的代碼檢查設備是否有攝像頭或不使用此

final boolean deviceHasCameraFlag = pm.hasSystemFeature(PackageManager.FEATURE_CAMERA); 

現在我上運行的是Android 4.0(ICS)平板測試我的代碼,並沒有攝像頭。但是我仍然得到了真實值deviceHasCameraFlag。這是奇怪的還是我錯過了一些東西。

我嘗試過不同的事情,甚至嘗試過與平板電腦相同的藍牙功能,即使沒有藍牙功能。它適用於藍牙,但適用於相機。

+0

[Check if device has a camera?](http://stackoverflow.com/questions/1944117/check-if-device-has-a-camera)可能有重複。請參閱最高投票答案:如果設備具有前/後/兩個攝像頭,它將返回「true」。 –

+0

是的設備沒有一個單一的攝像頭....這就是爲什麼我期望在那裏有一個虛假的價值...... –

+0

我發佈了一個代碼,它會正常工作,我實際檢查,如果它沒有相機和相機炒股罰款試試吧 –

回答

8

它是哪種設備?你得到的答案是一個錯誤,現在4.0已經很老了。仍然運行此版本的許多平板電腦都沒有正確製作,硬件和軟件都存在多個問題。

無論如何,您應該始終準備好處理Camera.open()Camera.open(0)的故障:例如,在某些情況下,設備上的其他軟件不會優雅地釋放相機。

所以,你的情況,你有一個假陽性,您嘗試打開攝像機,它失敗了,你繼續,如果有設備上沒有攝像頭,即使PackageManager認爲PackageManager.FEATURE_CAMERA是可用的。

+0

這就是我的想法,但不能肯定...因爲相同的調用適用於藍牙功能,相同的失敗相機...所以什麼是在這種設備錯誤情況下的解決方案..?我應該離開應用程序,它會崩潰在所有這些越野車設備或我應該總是檢查getNumberOfCameras,然後繼續。 –

+0

我不知道'getNumberOfCameras()'在這個設備上返回什麼。但我相信'Camera.open()'會拋出,所以你應該用'catch(RuntimeException e){deviceHasCameraFlag = false; }'。這意味着你必須從這個標誌中刪除'final'。 –

-2

請試試這個代碼:

private boolean isDeviceSupportCamera() { 
    if (getApplicationContext().getPackageManager().hasSystemFeature(
      PackageManager.FEATURE_CAMERA)) { 
     // this device has a camera 
     return true; 
    } else { 
     // no camera on this device 
     return false; 
    } 
} 

不過但這並沒有工作,那麼請讓我知道

+3

我想我在我的代碼中做同樣的事情....?這裏有什麼不同..? –

+0

你用這種方法試過了嗎?它還是返回'true'嗎? –

+3

'if(FOO)return true;否則返回false;'是如此多餘的......只是'返回FOO;' – stackunderflow

0

我得到了它,你會嘗試這一個肯定會工作....

import android.hardware.Camera; 
    int numCameras = Camera.getNumberOfCameras(); 
    if (numCameras > 0) { 
     System.out.println("camera"); 
    } else { 
     System.out.println("No Camera"); 
    } 
+0

所以在我的代碼中,我應該添加'context.getPackageManager()'而不是'getPackageManager()'我會試試。但是,爲什麼它的藍牙工作,因爲它是..? –

+0

@ y.dixit no..both會導致相同.. –

+0

@kalyanpvs然後,我的代碼有什麼問題......並且應該是'Context'或'context',因爲沒有這樣的'context'事情當我嘗試執行'context.getPackageManager()'時,提示我創建局部變量' –

1

在我來說,我有這樣的代碼:

public boolean hasCameraSupport() { 
    boolean hasSupport = false; 
    if(getPackageManager().hasSystemFeature(PackageManager.FEATURE_CAMERA_ANY)) { //<- this constant caused problems 
     hasSupport = true; 
    } 
    return hasSupport; 
} 

和它一直運行Android 4.1.1(API 16)一個Genymotion設備上返回false。一旦我將常量PackageManager.FEATURE_CAMERA_ANY更改爲PackageManager.FEATURE_CAMERA,我的問題就消失了。我猜測並非所有設備/ API級別都支持PackageManager.FEATURE_CAMERA_ANY

+0

我感謝你對此的幫助......但如果你看到我的代碼,我已經使用了'PackageManager.FEATURE_CAMERA'而不是'PackageManager.FEATURE_CAMERA_ANY'。 –

+0

@ y.dixit也許你應該嘗試'PackageManager.FEATURE_CAMERA_ANY'而不是? –

+0

是的,我同意...但即使它工作,它不能保證它將適用於所有設備,因爲在你的情況下它不適用?所以我的意思是我們需要一些能夠在所有設備上工作的東西。我已經發布了我的解決方案檢查一次,讓我知道如果你同意...... –

3

儘管我已經接受了亞歷克斯的回答,但我仍然希望將這個集體統稱爲在這種情況下最好的解決方案。

我發現什麼是在一些低標準的Android設備

pm.hasSystemFeature(PackageManager.FEATURE_CAMERA) 

返回true的情況下,即使相機不存在,這似乎是我的一個錯誤設備在其選中。

因此,無論何時出現需要檢查設備是否存在照相機的情況,或者最佳做法是我在下面提出的事項(根據我的知識,最佳做法是否有更有趣和最好的解決方案,歡迎大家把它放在這裏對這個職位)

int numberOfCameras = Camera.getNumberOfCameras(); 
context = this; 
PackageManager pm = context.getPackageManager(); 
final boolean deviceHasCameraFlag = pm.hasSystemFeature(PackageManager.FEATURE_CAMERA); 

if(!deviceHasCameraFlag || numberOfCameras==0) 
{ 
    Log.e(TAG, "Device has no camera" + numberOfCameras); 
    Toast.makeText(getApplicationContext(), "Device has no camera",  Toast.LENGTH_SHORT).show(); 
    captureButton.setEnabled(false); 
} 
else 
{ 
    Log.e(TAG, "Device has camera" + deviceHasCameraFlag + numberOfCameras); 
} 

在此我檢查兩個數的攝像頭以及設備具有攝像功能的布爾值,因此在任何情況下,它不會辜負我的條件。

+0

只有在單擊captureButton時纔打開攝像頭嗎?即使你這樣做,我也會建議**嘗試一次(如果FEATURE_CAMERA和getNumberOfcameras()檢查爲正),並且如果拋出,則寫一個帶有標誌「此設備無法捕捉「。 –

+0

我在代碼中做的是在應用程序啓動時檢查設備是否有攝像頭,如果攝像頭不存在,則禁用用戶的捕捉按鈕,以便即使他按下該按鈕也不會發生任何事情。所以它不會達到'camera.open()'調用。 –

+1

我會檢查,而以下: 如果(deviceHasCameraFlag && numberOfCameras> 0){ // ....設備具有相機 } 其他{ // ...沒有攝像頭 } –

相關問題