バーコードスキャナーの開発にZxingライブラリを使用しようとしています。
私の活動は次のとおりです。
public class Scanner extends Activity {
private static final String PACKAGE = "com.test.scan";
private static final String SCANNER = "com.google.zxing.client.Android.SCAN";
private static final String SCAN_FORMATS = "UPC_A,UPC_E,EAN_8,EAN_13,CODE_39,CODE_93,CODE_128";
private static final String SCAN_MODE = "QR_CODE_MODE";
public static final int REQUEST_CODE = 1;
@Override
public void onCreate(Bundle icicle) {
super.onCreate(icicle);
setContentView(R.layout.main);
Button ok;
ok = (Button) findViewById(R.id.b1);
ok.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
Intent scanIntent = new Intent(SCANNER);
scanIntent.setPackage(PACKAGE);
scanIntent.addCategory(Intent.CATEGORY_DEFAULT);
scanIntent.putExtra("SCAN_FORMATS", SCAN_FORMATS);
scanIntent.putExtra("SCAN_MODE", SCAN_MODE);
try {
startActivityForResult(scanIntent, REQUEST_CODE);
} catch (ActivityNotFoundException e) {
// TODO: Exception handling
}
}
});
}
マニフェストファイル:
<activity Android:name=".Scanner"
Android:screenOrientation="landscape" Android:configChanges="orientation|keyboardHidden"
Android:theme="@Android:style/Theme.NoTitleBar.Fullscreen"
Android:windowSoftInputMode="stateAlwaysHidden">
<intent-filter>
<action Android:name="Android.intent.action.MAIN" />
<category Android:name="Android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity Android:name="com.google.zxing.client.Android.CaptureActivity"
Android:screenOrientation="landscape" Android:configChanges="orientation|keyboardHidden"
Android:theme="@Android:style/Theme.NoTitleBar.Fullscreen"
Android:windowSoftInputMode="stateAlwaysHidden">
<intent-filter>
<action Android:name="com.google.zxing.client.Android.SCAN" />
<category Android:name="Android.intent.category.DEFAULT" />
</intent-filter>
</activity>
<activity Android:name="com.google.zxing.client.Android.PreferencesActivity"
Android:label="@string/preferences_name">
</activity>
<activity Android:name="com.google.zxing.client.Android.HelpActivity"
Android:screenOrientation="user">
<intent-filter>
<action Android:name="Android.intent.action.VIEW" />
<category Android:name="Android.intent.category.DEFAULT" />
</intent-filter>
</activity>
<activity Android:name="com.google.zxing.client.Android.share.ShareActivity"
Android:label="@string/share_name" Android:screenOrientation="user"
Android:theme="@Android:style/Theme.Light">
<intent-filter>
<action Android:name="com.google.zxing.client.Android.SHARE" />
<category Android:name="Android.intent.category.DEFAULT" />
</intent-filter>
</activity>
<uses-permission Android:name="Android.permission.CAMERA"
しかし、次のエラーが発生します。
「申し訳ありませんが、Androidカメラで問題が発生しました。デバイスを再起動する必要がある場合があります」。
私はいくつかのブログをフォローしました。
ログ:
Unexpected error initializating camera
01-27 10:40:48.281: WARN/CaptureActivity(1007): Java.lang.RuntimeException: Fail to connect to camera service
01-27 10:40:48.281: WARN/CaptureActivity(1007): at Android.hardware.Camera.native_setup(Native Method)
01-27 10:40:48.281: WARN/CaptureActivity(1007): at Android.hardware.Camera.<init>(Camera.Java:185)
01-27 10:40:48.281: WARN/CaptureActivity(1007): at Android.hardware.Camera.open(Camera.Java:165)
01-27 10:40:48.281: WARN/CaptureActivity(1007): at com.google.zxing.client.Android.camera.CameraManager.openDriver(CameraManager.Java:126)
01-27 10:40:48.281: WARN/CaptureActivity(1007): at com.google.zxing.client.Android.CaptureActivity.initCamera(CaptureActivity.Java:606)
01-27 10:40:48.281: WARN/CaptureActivity(1007): at com.google.zxing.client.Android.CaptureActivity.surfaceCreated(CaptureActivity.Java:346)
01-27 10:40:48.281: WARN/CaptureActivity(1007): at Android.view.SurfaceView.updateWindow(SurfaceView.Java:532)
01-27 10:40:48.281: WARN/CaptureActivity(1007): at Android.view.SurfaceView.dispatchDraw(SurfaceView.Java:339)
これは、デバイスがCamera.open()
からnull
を返したことを意味し、これを行うべきではありません。デバイスのバグとして扱われます。なぜこれを行うのかをどのようにデバッグするのかわかりませんが、それが原因です。
これが一貫して発生するのを私が見たのは、フロントカメラを備えたAndroid 2.2デバイスのみです。フロントカメラにアクセスするためのAPIは、Android = 2.3であり、以前のCamera.open()
APIメソッドは背面カメラのみを返す可能性があるため、これらはnull
を返します。実際に実行する必要があるため、これはデバイスのバグです。 Android 2.3は、アプリがフロントカメラを使用できるようにします。
Android 6+の場合、「許可」の問題のため、「申し訳ありませんが、カメラで問題が発生しました。デバイスを再起動する必要がある可能性があります。」というメッセージが表示された場合は、[設定]-に移動します。アプリ-「アプリ名」を見つけます-権限を選択し、「カメラ」をオンにします。
カメラの許可
<uses-permission Android:name="Android.permission.CAMERA"
適切な場所にありません。アプリケーションタグの後にある必要があります。
私も同様の問題に直面しました。 Android Mでテストしている間、カメラにはランタイム権限が必要です。同様のシナリオで立ち往生している人を助けるために、参照用にこの回答を追加します。
Android 8.1.0で、コードを介してアプリの権限をリクエストすることで問題を解決しました。
その理由は(私が思うに)新しいAndroidバージョンでは、コードでアクセス許可を要求する必要があるバージョンでデバイスアクセスを処理する際のポリシーが変更されたためです。必要なアクセス許可をに入れるだけでは不十分です。 XML。ユーザーは、アプリの使用中にアクセスを拒否するかどうかを選択する必要があります。
「give-permission-popup」をアクティブにするには、次の例を使用できます。 MainActivityのonCreateの内部:
if (ContextCompat.checkSelfPermission(getApplicationContext(), Manifest.permission.CAMERA)
== PackageManager.PERMISSION_DENIED) {
ActivityCompat.requestPermissions(MainActivity.this, new String[] {Manifest.permission.CAMERA}, MY_CAMERA_REQUEST_CODE);
}
設定を介して権限をアクティブ化するのと同じ効果があります。ただし、実際のアプリでは、アプリ内から権限を要求する方がおそらくユーザーフレンドリーです。
Toastでカメラの許可を追加するだけです:
if (ActivityCompat.checkSelfPermission(this, Manifest.permission.CAMERA)
== PackageManager.PERMISSION_GRANTED) {
// Permission is already available, start camera preview
Toast.makeText(this,"camera permission granted",Toast.LENGTH_LONG).show();
} else {
// Permission is missing and must be requested.
requestCameraPermission();
}
および:
private void requestCameraPermission() {
// Permission has not been granted and must be requested.
if (ActivityCompat.shouldShowRequestPermissionRationale(this,
Manifest.permission.CAMERA)) {
// Provide an additional rationale to the user if the permission was not granted
// and the user would benefit from additional context for the use of the permission.
// Display a SnackBar with cda button to request the missing permission.
Toast.makeText(this, "Camera access is required to Scan The Barcode.",
Toast.LENGTH_LONG).show();
// Request the permission
ActivityCompat.requestPermissions(CaptureActivity.this,
new String[]{Manifest.permission.CAMERA},
PERMISSION_REQUEST_CAMERA);
} else {
Toast.makeText(this,
"<b>Camera could not be opened.</b>\\nThis occurs when the camera is not available (for example it is already in use) or if the system has denied access (for example when camera access has been disabled).", Toast.LENGTH_SHORT).show();
// Request the permission. The result will be received in onRequestPermissionResult().
ActivityCompat.requestPermissions(this,
new String[]{Manifest.permission.CAMERA}, PERMISSION_REQUEST_CAMERA);
}
}
私は同じ問題を抱えています
SurfaceHolder surfaceHolder = surfaceView.getHolder();
surfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_Push_BUFFERS);
注:これは、コードが以前は機能していたため、OS(V3.0以前のAndroid)の最近の問題のようです。
デバイス管理者がカメラへのアクセスを無効にしている可能性があります。 Androidカメラアプリを起動できるかどうか、またはデバイス管理者に文句を言うかどうかを確認する必要があります。