2014-03-26 6 views
8

Ich habe eine Anwendung, die Kamerafunktionalität verwendet, aber ein Teil ihrer Funktionalität kann auch ohne Kamerafunktion ausgeführt werden. SO habe ich das in mein Manifest geschrieben.hasSystemFeature (PackageManager.FEATURE_CAMERA) gibt true für Gerät ohne Kamera zurück

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

und in meinem Code ich überprüfen, ob das Gerät Kamera oder nicht mit diesen

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

Jetzt teste ich meinen Code auf einer Tablette, die Android 4.0 (ICS) läuft hat und keine Kamera hat. Aber trotzdem bekomme ich True Wert für die deviceHasCameraFlag. Ist das komisch oder fehlt mir etwas?

Ich habe verschiedene Dinge ausprobiert und sogar das Gleiche über Bluetooth-Funktion versucht, da das Tablet sogar keine Bluetooth-Funktion hat. Es funktioniert gut für Bluetooth, aber gibt mir die Kamera wahr.

+0

mögliches Duplikat von [Prüfen Sie, ob das Gerät eine Kamera hat?] (Http://StackOverflow.com/questions/1944117/check-if-device-has-a-camera). Bitte beachten Sie die Antwort mit der höchsten Wahl: Es wird "wahr" zurückgegeben, wenn das Gerät vorne/hinten/beide Kameras hat. –

+0

Ja Gerät hat keine einzige Kamera .... Deshalb erwarte ich einen falschen Wert dort .... –

+0

Ich postete einen Code es funktioniert gut Ich habe praktisch in beiden Fällen überprüft, wenn es keine Kamera und Kamera hat woks fine Probieren Sie es einfach –

Antwort

8

Welches Gerät ist es? Die Antwort, die Sie bekommen, ist ein Fehler, und 4.0 ist heutzutage sehr alt. Viele Tablets, auf denen diese Version noch ausgeführt wird, wurden nicht korrekt erstellt, da sowohl Hardware als auch Software mehrere Probleme aufweisen.

Unabhängig davon sollten Sie immer darauf vorbereitet sein, Fehler auf Camera.open() oder Camera.open(0) zu behandeln: zum Beispiel, in einigen Fällen wird andere Software auf Ihrem Gerät nicht die Kamera elegant freigeben.

in Ihrem Fall also, Sie haben einen Fehlalarm, Sie versuchen, die Kamera zu öffnen, es schlägt fehl, und Sie weiterhin, als ob es keine Kamera auf dem Gerät, auch wenn Package denkt, dass PackageManager.FEATURE_CAMERA ist verfügbar.

+0

Das war, was ich dachte, aber war nicht sicher, dass das ... schließen, da der gleiche Anruf funktioniert für die Bluetooth-Funktion und das gleiche für Kamera fehlschlägt ... Also was ist das? Lösung hier in solchen Gerät Bug-Fall ..? Sollte ich die Anwendung so lassen, wie sie ist und sie wird auf all diesen fehlerhaften Geräten abstürzen oder sollte ich getNumberOfCameras immer überprüfen und dann fortfahren.>? –

+0

Ich weiß nicht, was 'getNumberOfCameras()' auf diesem Gerät zurückgibt. Aber ich glaube, dass 'Camera.open()' werfen wird, also solltest du diesen Aufruf mit 'catch (RuntimeException e) {packageHasCameraFlag = false; } '. Dies bedeutet, dass Sie "final" von diesem Flag entfernen müssen. –

-2

Bitte versuchen Sie diesen Code:

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

Noch does't es Arbeit dann bitte mich

+3

Ich denke, ich mache das gleiche in meinem Code ....? Was ist hier anders? –

+0

hast du das mit dieser Methode versucht, gibt es trotzdem 'true'? –

+3

'wenn (FOO) Wahr zurückgibt; else return false; 'ist so redundant ... einfach' 'return FOO;' – stackunderflow

0

lassen weiß, dass ich es bekam werden Sie diese auf jeden Fall versuchen wird es funktionieren ....

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

Also in meinem Code sollte ich 'context.getPackageManager()' anstelle von 'getPackageManager()' hinzufügen Ich werde das versuchen. Aber warum funktioniert es dann für Bluetooth? –

+0

@ y.dixit no..both führt zu der gleichen .. –

+0

@kalyanpvs Dann was ist falsch mit meinem Code ..... und sollte es sein "Kontext" oder "Kontext", da es keine solche "Kontext" Sache gibt es fordert mich auf, lokale Variable zu erstellen, wenn ich versuche, 'context.getPackageManager()' –

1

In meinem Fall hatte ich diesen Code:

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

und es hielt auf einem Genymotion Gerät falsch Rückkehr mit Android 4.1.1 (API 16). Sobald ich die Konstante PackageManager.FEATURE_CAMERA_ANY zu PackageManager.FEATURE_CAMERA änderte, gingen meine Probleme weg. Ich vermute, dass nicht alle Geräte/API-Level PackageManager.FEATURE_CAMERA_ANY unterstützen.

+0

Ich weiß Ihre Hilfe zu schätzen ... aber wenn Sie meinen Code sehen, habe ich 'PackageManager.FEATURE_CAMERA' und nicht' PackageManager.FEATURE_CAMERA_ANY' verwendet. –

+0

@ y.dixit Vielleicht sollten Sie stattdessen 'PackageManager.FEATURE_CAMERA_ANY' ausprobieren? –

+0

Ja, ich stimme zu ... aber selbst wenn es funktioniert, kann es nicht garantieren, dass es für alle Geräte funktioniert, da es in deinem Fall nicht richtig funktioniert hat?Also, was mein Punkt ist, wir brauchen etwas, das auf allen Geräten funktioniert. Ich habe meine Lösung überprüft, dass einmal und lassen Sie mich wissen, wenn Sie damit einverstanden sind .... –

3

Obwohl ich die Antwort von Alex akzeptiert habe, möchte ich diese dennoch kollektiv als die beste Lösung in einem solchen Zustand betrachten.

Was ich war

pm.hasSystemFeature(PackageManager.FEATURE_CAMERA) 

gibt true zurück, auch wenn die Kamera nicht existiert und das scheint zu sein, ein Gerät Fehler für mich, die in ungeprüft gefunden bei einigen niedrigen Standard Android-Geräte.

Also, wenn es ein Szenario gibt, das Sie überprüfen müssen, ob die Kamera für ein Gerät vorhanden ist oder nicht Best Practice ist etwas, das ich unten setze (Best Practice nach meinem Wissen, wenn es etwas interessanter und beste Lösung, dass Sie sind willkommen hier auf diesen Beitrag setzen)

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

in dieser ich beide Anzahl der Kameras nicht mein Zustand versagen würde es so gut wie Gerät verfügt über Kamera-Funktion Boolean, so in jedem Fall bin Überprüfung.

+0

Öffnen Sie die Kamera nur mit einem Klick auf den CaptureButton? Selbst wenn Sie dies tun, würde ich vorschlagen, ** (** 'Camera.open()' einmal auszuprobieren (wenn die Checks FEATURE_CAMERA und getNumberOfcameras() positiv sind) und wenn es ausgelöst wird, schreiben Sie eine lokale Datei mit dem Flag " Dieses Gerät kann nicht erfassen ". –

+0

Was ich in meinem Code tue, ist zu überprüfen, ob das Gerät eine Kamera hat oder nicht, wenn die Anwendung startet und wenn die Kamera nicht existiert, dann deaktiviere die Aufnahmetaste für den Benutzer, so dass selbst wenn er diesen Knopf drückt nichts passiert. Damit erreicht es den Aufruf camera.open() 'nicht. –

+1

Ich würde überprüfen, eher nach folgenden Kriterien: if (deviceHasCameraFlag && numberOfCameras> 0) { // .... Gerät verfügt über Kamera } else { // ... keine Kamera } –

Verwandte Themen