2017-07-19 6 views
0

android vision barcode-reader sampleの部分を使ってQRコードを読み取っています。ときどき(500人中2人のように)Firebaseクラッシュレポートを取得しています。これはCamera.openで発生します。Android Camera.openが失敗することがある

java.lang.RuntimeException: 
at android.hardware.Camera.<init>(Camera.java:678) 
at android.hardware.Camera.open(Camera.java:520) 
at mobilevision.CameraSource.createCamera(CameraSource.java:0) 
at <OR>.access$2200(CameraSource.java:0) 
at mobilevision.CameraSource.release(CameraSource.java:0) 
at <OR>.start(CameraSource.java:0) 
at <OR>.getIdForRequestedCamera(CameraSource.java:0) 
at <OR>.selectSizePair(CameraSource.java:0) 
at <OR>.generateValidPreviewSizeList(CameraSource.java:0) 
at <OR>.selectPreviewFpsRange(CameraSource.java:0) 
at <OR>.setRotation(CameraSource.java:0) 
at <OR>.createPreviewBuffer(CameraSource.java:0) 
at <OR>.access$102(CameraSource.java:0) 
at <OR>.access$202(CameraSource.java:0) 
at <OR>.access$302(CameraSource.java:0) 
at <OR>.access$502(CameraSource.java:0) 
at <OR>.access$802(CameraSource.java:0) 
at <OR>.access$1800(CameraSource.java:0) 
at mobilevision.CameraSourcePreview.startIfReady(CameraSourcePreview.java:0) 
at mobilevision.CameraSourcePreview.start(CameraSourcePreview.java:0) 
at <OR>.start(CameraSourcePreview.java:0) 
at <OR>.stop(CameraSourcePreview.java:0) 
at <OR>.access$102(CameraSourcePreview.java:0) 
at <OR>.access$200(CameraSourcePreview.java:0) 
at mobilevision.CameraSourcePreview$SurfaceCallback.surfaceCreated(CameraSourcePreview.java:0) 
at android.view.SurfaceView.updateWindow(SurfaceView.java:679) 
at android.view.SurfaceView$3.onPreDraw(SurfaceView.java:206) 
at android.view.ViewTreeObserver.dispatchOnPreDraw(ViewTreeObserver.java:944) 
at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:2432) 
at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1328) 
at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:6730) 
at android.view.Choreographer$CallbackRecord.run(Choreographer.java:894) 
at android.view.Choreographer.doCallbacks(Choreographer.java:696) 
at android.view.Choreographer.doFrame(Choreographer.java:631) 
at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:880) 
at android.os.Handler.handleCallback(Handler.java:815) 
at android.os.Handler.dispatchMessage(Handler.java:104) 
at android.os.Looper.loop(Looper.java:207) 
at android.app.ActivityThread.main(ActivityThread.java:5765) 
at java.lang.reflect.Method.invoke(Method.java:0) 
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:789) 
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:679) 
例外がスローされ

コードの一部:

int requestedCameraId = getIdForRequestedCamera(mFacing); 
if (requestedCameraId == -1) { 
    throw new Exception("Could not find requested camera."); 
} 

Camera camera = Camera.open(requestedCameraId); 

私はそれがバーコードリーダーのサンプルで実装されているのと同様にカメラの許可を求めています。残念ながら、私はこの正確な例外を再現することができません。 しかし、カメラなしでエミュレータでアプリケーションを実行すると、同様の例外を再現することができました(どちらのカメラもnoneに設定されています)。しかし、この例外は実際のデバイスで発生するため、私は何が原因かと思っています。 クラッシュレポートに表示される電話機は、 Galaxy J1(2016)(j1x3g)A5.1、Plume P6 Pro LTE(PGN528)A6.0、3600i(CP3600I)、A6.0。

この例外を再現する方法のヒントを誰にでも教えていただけますか?許可が与えられてもカメラを起動できない理由を知っている人はいますか?

ありがとうございます!

答えて

0

質問にお答えします。

対応するcheckPermission()メソッドがありますが、これらのメソッドは、マニフェストファイルにアクセス権が登録されているかどうかのみを判定します。ユーザーの操作はアクセスできません。

PackageManager packageManager = this.getPackageManager(); 
int permission = packageManager.checkPermission("android.permission.CAMERA", "your packageName"); 
if (PackageManager.PERMISSION_GRANTED == permission) { 
    // you can do something 
} else { 
    // request permission 
} 

したがって、6.0より下のシステムでどのようにパーミッションを検出するのですか?

public boolean isCameraCanUse() { 
    boolean isCanUse = true; 
    Camera mCamera = null; 
    try { 
     mCamera = Camera.open(); 
     Camera.Parameters mParameters = mCamera.getParameters(); //针对魅族手机 
     mCamera.setParameters(mParameters); 
    } catch (Exception e) { 
     isCanUse = false; 
    } 

    if (mCamera != null) { 
     try { 
      mCamera.release(); 
     } catch (Exception e) { 
      e.printStackTrace(); 
      return isCanUse; 
     } 
    } 
    return isCanUse; 
} 

私はこれが役に立てば幸い: 本発明の方法はtry{} catch){}方法の使用です。

+0

ありがとうございます!私はすでにcheckPermissionを使用しており、APIレベル21,22,23についてこのエラーが発生しています。 APIレベル21では、ユーザーが権限を拒否できないか、何か不足しているため、いつでもカメラにアクセスできます。 – Iceman

関連する問題