Android запрашивает разрешение камеры при запуске активности - PullRequest
0 голосов
/ 24 апреля 2018

Мне нужно запросить разрешение камеры, но каким-то образом я не могу управлять им.

У меня есть следующая функция, которую я вызываю в моем методе onCreate:

public void checkCameraPermission() {
    if (ContextCompat.checkSelfPermission(this, Manifest.permission.CAMERA) != PackageManager.PERMISSION_GRANTED) {
        ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.CAMERA}, PERMISSION_CAMERA);
    }
}

Но Android Studio дает мне это сообщение Cannot resolve Symbol CAMERA

Я еще не начал соревнование.

В моем файле манифеста у меня есть следующие разрешения:

<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.VIBRATE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.RECORD_AUDIO" />
<uses-permission android:name="android.permission.CAMERA" />

<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.FLASHLIGHT" />
<uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS" />

<uses-feature android:name="android.hardware.camera2" />
<uses-feature android:name="android.hardware.camera.any" android:required="false" />
<uses-feature android:name="android.hardware.camera.autofocus" android:required="false" />
<uses-feature android:name="android.hardware.camera.flash" android:required="false" />
<uses-feature android:name="android.hardware.microphone" android:required="false" />

Есть идеи, как правильно запрашивать разрешение программно?

Мой Build.gradle:

apply plugin: 'com.android.application'

android {
    compileSdkVersion 26
    buildToolsVersion '24.0.0'
    useLibrary 'org.apache.http.legacy'
    defaultConfig {
        applicationId 'com.foo.var
        minSdkVersion 22
        targetSdkVersion 22
        versionCode 5
        versionName "1.2"
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
    productFlavors {
    }


    compileOptions {
        targetCompatibility 1.8
        sourceCompatibility 1.8
    }
}

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    compile 'com.android.support:appcompat-v7:24.1.1'
    compile 'com.android.support:support-v4:24.1.1'

    compile 'com.github.GrenderG:Toasty:1.2.5' // Toasty Class
    compile 'com.jakewharton:butterknife:8.1.0'//Butterknife
    annotationProcessor 'com.jakewharton:butterknife-compiler:8.1.0'
    compile 'com.squareup.retrofit2:retrofit:2.3.0' // REST Call
    compile 'com.squareup.retrofit2:converter-moshi:2.3.0'
    compile 'com.squareup.retrofit2:converter-gson:2.3.0' // JSON Converter für Retrofit
    compile 'com.basgeekball:awesome-validation:2.0' 
    compile 'com.github.apl-devs:appintro:v4.2.2' // AppIntro
    compile 'com.github.KyleBanks:animated-line-graph-view:v1.0.1'

    // constraint layout
    compile 'com.android.support.constraint:constraint-layout:1.0.2'

    // from webrtc sample ...
    // compile 'com.pubnub:pubnub-android:3.7.4'
    compile group: 'com.pubnub', name: 'pubnub-gson', version: '4.18.0'
    compile 'io.pristine:libjingle:9694@aar'
    compile project(':pnwebrtc')
}

Ответы [ 3 ]

0 голосов
/ 24 апреля 2018

Попробуйте с оператором импорта ниже: -

import android.Manifest;

Вы можете попробовать следующим образом - замените ваш код на: -

 int permissionCheck = Context.checkSelfPermission(getActivity(),
                        Manifest.permission.CAMERA);
                if (permissionCheck== PackageManager.PERMISSION_DENIED) {
                    requestPermissions(new String[]{Manifest.permission.CAMERA, Manifest.permission.WRITE_EXTERNAL_STORAGE, Manifest.permission.READ_EXTERNAL_STORAGE}, REQUEST_WRITE_STORAGE);
                }
0 голосов
/ 24 апреля 2018

Я предлагаю использовать RxPermission Library . Вот так выглядит код.

RxPermissions rxPermissions = new RxPermissions(this); 
rxPermissions
    .request(Manifest.permission.CAMERA)
    .subscribe(granted -> {
        if (granted) { // Always true pre-M
           // I can control the camera now
        } else {
           // Oups permission denied
        }
    });

Разве это не выглядит довольно чисто и коротко! :)

Зависимость Gradle

dependencies {
    compile 'com.tbruyelle.rxpermissions2:rxpermissions:0.9.5@aar'
}
0 голосов
/ 24 апреля 2018

Попробуйте это для этого двух методов ..

    private static final int REQUEST_PERMISSIONS_REQUEST_CODE = 34;
   /**
 * this method check permission and return current state of permission need.
 */
private boolean checkPermissions() {
    int permissionState = ActivityCompat.checkSelfPermission(this,
            Manifest.permission.CAMERA);
    return permissionState == PackageManager.PERMISSION_GRANTED;
}

/**
 * this method request to permission asked.
 */
private void requestPermissions() {
    boolean shouldProvideRationale =
            ActivityCompat.shouldShowRequestPermissionRationale(this,
                    Manifest.permission.CAMERA);

    if (shouldProvideRationale) {
        Log.i(TAG, "Displaying permission rationale to provide additional context.");
           } else {
        Log.i(TAG, "Requesting permission");
        // previously and checked "Never ask again".
        ActivityCompat.requestPermissions(MainActivity.this,
                new String[]{Manifest.permission.ACCESS_FINE_LOCATION},
                REQUEST_PERMISSIONS_REQUEST_CODE);
    }
}

затем при проверке вот так ..

  if (!checkPermissions()) {
        requestPermissions();
    }

эта переменная REQUEST_PERMISSIONS_REQUEST_CODE получает доступ к методу onResult, как показано ниже: ..

/**
 * Callback received when a permissions request has been completed.
 */
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions,
                                       @NonNull int[] grantResults) {
    Log.i(TAG, "onRequestPermissionResult");
    if (requestCode == REQUEST_PERMISSIONS_REQUEST_CODE) {
        if (grantResults.length <= 0) {
            // If user interaction was interrupted, the permission request is cancelled and you
            // receive empty arrays.
            Log.i(TAG, "User interaction was cancelled.");
        } else if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {
            // Permission was granted. Kick off the process of building and connecting
            // GoogleApiClient.
            // perform your operation
        } else {
            // Permission denied.
        }
    }
}
...