Разрешения во время выполнения: QR Reader
Я работаю над приложением QR Reader, мне нужна помощь в Runtime Permission для Android M и более поздних версиях.
Проблема: я могу запросить разрешение и даже получить разрешение для камеры. Но менеджер пакетов вызывает проблемы. Я скопировал разрешение времени выполнения с какого-то веб-сайта и сократил его только для разрешений камеры.
Случай: Когда я устанавливаю приложение в первый раз и нажимаю кнопку, которая вызывает камеру (она запрашивает разрешение камеры), я даю разрешение. Далее открывается диспетчер пакетов, и я выбираю камеру своего устройства. Теперь он открывает камеру устройства. Не камера Zxing mscanner (QR Framework).
Ниже приведен мой код, уверен, что я получу некоторую помощь здесь.
Мое требование: когда я разрешаю камеру при первом запуске приложения и нажимаю кнопку "Сканировать", она должна открыться как обычный QR-сканер. Это работало нормально без прав выполнения, но сейчас - я хочу узнать больше о RTP для дальнейшего использования.
Для тестирования я использую Зефир и Нугу.
В обоих случаях я даю разрешение вручную и знаю, что мне нужно решить эту проблему, используя Разрешение времени выполнения для последних устройств / ОС. Я близок к этому, но мне нужна логическая помощь.
//QR Scanner App using Zebra Crossing Framework Sample HAve to User Run time
//Permissions for only Camera for API Level 23 and above
import com.google.zxing.Result;
import me.dm7.barcodescanner.zxing.ZXingScannerView;
//Above imports
import static android.R.attr.permission;
import static android.media.MediaRecorder.VideoSource.CAMERA;
public class MainActivity extends AppCompatActivity implements ZXingScannerView.ResultHandler {
private ZXingScannerView mScannerView;
static final Integer CAMERA = 0x5;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
//Nougat and Marshmallow
//ask for permission
private void askForPermission(String permission, Integer requestCode) {
if (ContextCompat.checkSelfPermission(MainActivity.this, permission) != PackageManager.PERMISSION_GRANTED) {
//asking for permission prompt
if (ActivityCompat.shouldShowRequestPermissionRationale(MainActivity.this, permission)) {
//request for permissions and getting request code -- 5 for camera
ActivityCompat.requestPermissions(MainActivity.this, new String[]{permission}, requestCode);
} else {
//requesting permission
ActivityCompat.requestPermissions(MainActivity.this, new String[]{permission}, requestCode);
}
} else {
Toast.makeText(this, "" + permission + " is already granted.", Toast.LENGTH_SHORT).show();
}
}
//Response for RunTime Permissions
@Override
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
if(ActivityCompat.checkSelfPermission(this, permissions[0]) == PackageManager.PERMISSION_GRANTED){
switch (requestCode) {
//Camera
case 5:
Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
if (takePictureIntent.resolveActivity(getPackageManager()) != null) {
startActivityForResult(takePictureIntent, 12);
}
// askForPermission(Manifest.permission.CAMERA,CAMERA);
break;
}
Toast.makeText(this, "Permission granted",Toast.LENGTH_SHORT).show();
}
else
{
Toast.makeText(this, "Permission denied", Toast.LENGTH_SHORT).show();
}
}
//Runtime Permissions Done above
//QR Scanner Invokation below
public void QrScanner(View view){
askForPermission(Manifest.permission.CAMERA,CAMERA);
mScannerView = new ZXingScannerView(this); // Programmatically initialize the scanner view
setContentView(mScannerView);
mScannerView.setResultHandler(this); for scan results.
mScannerView.startCamera(); // Start camera
}
//code ends here