Hej,
Mam pewien problem z dostępem do kamery na tablecie oraz na telefonie.
Pierwszy etap to jest pobranie UUID urządzenia Androidwego
public class GetNumberActivity extends AppCompatActivity {
@Override
protected void attachBaseContext(Context newBase) {
super.attachBaseContext(CalligraphyContextWrapper.wrap(newBase));
}
private final static String EXTRA_MESSAGE = "uuidValue";
private static final int REQUEST_READ_PHONE_STATE = 1;
private static int REQUEST_CODE = 1;
private static TextView uuidTextView;
private String uunitValue;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_get_number);
Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
Typeface custom_fonts = Typeface.createFromAsset(getAssets(), "fonts/OpenSans-Light.ttf");
Typeface custom_fonts2 = Typeface.createFromAsset(getAssets(), "fonts/OpenSans-Bold.ttf");
TextView toolbarText = (TextView) findViewById(R.id.title_GetNumber);
toolbar.setNavigationIcon(R.drawable.ic_restart);
toolbarText.setTypeface(custom_fonts);
TextView stageOneText = (TextView) findViewById(R.id.stageOneText);
stageOneText.setTypeface(custom_fonts);
TextView stageTwoText = (TextView) findViewById(R.id.stageTwoText);
stageTwoText.setTypeface(custom_fonts);
TextView stageThreeText = (TextView) findViewById(R.id.stageThreeText);
stageThreeText.setTypeface(custom_fonts);
TextView generateCard = (TextView) findViewById(R.id.textViewGenerationCard);
generateCard.setTypeface(custom_fonts);
uuidTextView = (TextView) findViewById(R.id.uniqueNumberTextView);
uuidTextView.setTypeface(custom_fonts2);
if (PackageManager.PERMISSION_GRANTED == ActivityCompat.checkSelfPermission(GetNumberActivity.this, Manifest.permission.READ_PHONE_STATE)) {
uuidTextView.setText(deviceUDID(GetNumberActivity.this));
uunitValue = deviceUDID(GetNumberActivity.this);
}
TextView nextButton = (TextView) findViewById(R.id.nextButton);
nextButton.setTypeface(custom_fonts);
nextButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent(GetNumberActivity.this, ScanQrCodeActivity.class);
intent.putExtra(EXTRA_MESSAGE, uunitValue);
startActivityForResult(intent, REQUEST_CODE);
}
});
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
if (item.getItemId() == android.R.id.home) {
finish();
}
return super.onOptionsItemSelected(item);
}
public String deviceUDID(Context ctx) {
final TelephonyManager tm = (TelephonyManager) ctx.getSystemService(Context.TELEPHONY_SERVICE);
final String tmDevice, tmSerial, androidId;
tmDevice = "" + tm.getDeviceId();
tmSerial = "" + tm.getSimSerialNumber();
androidId = "" + android.provider.Settings.Secure.getString(ctx.getContentResolver(), android.provider.Settings.Secure.ANDROID_ID);
UUID deviceUuid = new UUID(androidId.hashCode(), ((long) tmDevice.hashCode() << 32) | tmSerial.hashCode());
String deviceId = deviceUuid.toString();
Log.d("Device Id", deviceId);
String newUUID = deviceId.replace("-", "");
String code = newUUID.substring(23, 31);
return code;
}
Następny etap skanowanie QR Coda tu używam Google api vision
public class ScanQrCodeActivity extends AppCompatActivity {
public final static String EXTRA_MESSAGE = "hotpValume";
private static final String TAG = "Wartość błędna QR Codu";
@Override
protected void attachBaseContext(Context newBase) {
super.attachBaseContext(CalligraphyContextWrapper.wrap(newBase));
}
SurfaceView cameraPreview;
private String hotpValue;
private String sms;
private String barcodeValue;
private String uuidDevice;
private TextView text;
/**
* ATTENTION: This was auto-generated to implement the App Indexing API.
* See https://g.co/AppIndexing/AndroidStudio for more information.
*/
private GoogleApiClient client;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_scan_qr_code);
Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
toolbar.setNavigationIcon(R.drawable.ic_restart);
Typeface custom_fonts = Typeface.createFromAsset(getAssets(), "fonts/OpenSans-Regular.ttf");
TextView title_app = (TextView) findViewById(R.id.title_application_scan);
title_app.setTypeface(custom_fonts);
TextView stageOneText = (TextView) findViewById(R.id.stageTwoText);
stageOneText.setTypeface(custom_fonts);
TextView stageTwoText = (TextView) findViewById(R.id.stageTwoText);
stageTwoText.setTypeface(custom_fonts);
text = (TextView) findViewById(R.id.textScan);
text.setTypeface(custom_fonts);
cameraPreview = (SurfaceView) findViewById(R.id.cameraPreview);
createCameraSource();
sms = getIntent().getStringExtra("smsCode");
uuidDevice = getIntent().getStringExtra("uuidValue");
client = new GoogleApiClient.Builder(this).addApi(AppIndex.API).build();
}
private void createCameraSource() {
final BarcodeDetector barcodeDetector = new BarcodeDetector.Builder(this).build();
final CameraSource cameraSource = new CameraSource.Builder(this, barcodeDetector)
.setAutoFocusEnabled(true)
.setRequestedPreviewSize(1600, 1200)
.build();
cameraPreview.getHolder().addCallback(new SurfaceHolder.Callback() {
@Override
public void surfaceCreated(SurfaceHolder holder) {
if (PackageManager.PERMISSION_GRANTED == ActivityCompat.checkSelfPermission(ScanQrCodeActivity.this, Manifest.permission.CAMERA)) {
try {
cameraSource.start(cameraPreview.getHolder());
} catch (IOException e) {
Log.w(TAG, e);
e.printStackTrace();
}
}else {
showAlterDialog("Brak uprawnień ", "Brak uprawnień do camery. Spróbuj jeszcze raz.");
}
}
@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
}
@Override
public void surfaceDestroyed(SurfaceHolder holder) {
cameraSource.stop();
}
});
barcodeDetector.setProcessor(new Detector.Processor<Barcode>() {
@Override
public void release() {
}
@Override
public void receiveDetections(Detector.Detections<Barcode> detections) {
final SparseArray<Barcode> barcodes = detections.getDetectedItems();
if (barcodes.size() != 0) text.post(new Runnable() {
@Override
public void run() {
Vibrator v = (Vibrator) getSystemService(Context.VIBRATOR_SERVICE);
v.vibrate(500);
String barcodeString = barcodes.valueAt(0).displayValue;
}
});
}
});
}
Teraz sprawdziłam ze na moich telefonach Nexus 5 oraz Asus pojawia sie alter dialog Brak dostępu do Camery . Jak testuje apkę na tsblecie Samsung Tab 4 wszystko wyświetla się widok camery można skanować QR Code. Nie wiem czy źle to zaimplementowałam.