android - telephone - androïd




Demander des autorisations à l'exécution, Android M+ (2)

Tout d'abord, je sais que c'est une question en double, mais j'ai été sur les réponses d'autres questions similaires et n'ont pas été en mesure de trouver le succès avec l'une de ces solutions.

J'ai développé une application qui fonctionne parfaitement sur mon appareil de test qui est un Samsung S4 sous Android L (5.0.1) mais je voudrais que cette application fonctionne également sur les nouvelles versions d'Android.

Je comprends que les demandes d'autorisations ont été modifiées pour Android M + afin qu'elles soient demandées au moment de l'exécution, mais lorsque j'essaie de l'implémenter, la boîte de dialogue n'apparaît jamais et les autorisations requises ne sont jamais demandées.

L'autorisation que je demande est ACCESS_FINE_LOCATION .

Voici le code pertinent de mon fichier manifeste:

<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />

Où je demande la permission si elle n'est pas déjà accordée:

if (ActivityCompat.checkSelfPermission(MapsActivity.this, Manifest.permission.ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED) {

    startGeofenceMonitoring();

} else {
    askForPermission(android.Manifest.permission.ACCESS_FINE_LOCATION,LOCATION);
}

Fonction askForPermission (légèrement modifiée à partir de l'exemple de Google):

private void askForPermission(String permission, Integer requestCode) {
    if (ContextCompat.checkSelfPermission(MapsActivity.this, permission) != PackageManager.PERMISSION_GRANTED) {

        // Should we show an explanation?
        if (ActivityCompat.shouldShowRequestPermissionRationale(MapsActivity.this, permission)) {

            //This is called if user has denied the permission before
            //In this case I am just asking the permission again
            ActivityCompat.requestPermissions(MapsActivity.this, new String[]{permission}, requestCode);

        } else {

            Log.d(TAG, "askForPermission: " + permission);

            ActivityCompat.requestPermissions(MapsActivity.this, new String[]{permission}, requestCode);
        }
    } else {
        Toast.makeText(this, "" + permission + " is already granted.", Toast.LENGTH_SHORT).show();
    }
}

Et la fonction onRequestPermissionsResult:

@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
    super.onRequestPermissionsResult(requestCode, permissions, grantResults);

    Log.d(TAG, "onRequestPermissionsResult: " + requestCode);

        switch (requestCode) {
            case 1:
                if (grantResults.length > 0
                        && grantResults[0] == PackageManager.PERMISSION_GRANTED) {

                    Log.d(TAG, "onRequestPermissionsResult: request");

                    Toast.makeText(this, "Permission granted", Toast.LENGTH_SHORT).show();

                    startGeofenceMonitoring();
                }
                break;
        }
}

Comme je l'ai dit, la boîte de dialogue qui demande les autorisations n'apparaît jamais, mais ma console me dit que ActivityCompat.requestPermissions(MapsActivity.this, new String[]{permission}, requestCode); est appelé, et après beaucoup de recherches, je ne suis toujours pas sûr pourquoi cela ne fonctionne pas. La seule chose à laquelle je pense que cela pourrait être dû est que cette activité est une activité Fragment affichant une carte Google Maps. J'ai essayé de demander les autorisations dans une autre activité mais la même chose arrive exactement.

Merci.

MODIFIER

Donc, je viens de tester le code que j'ai posté ici dans un projet complètement nouveau et il s'est très bien passé et a montré la boîte de dialogue. Je suis maintenant vraiment confus quant à ce qui empêche cette boîte de dialogue d'être montrée dans mon projet actuel.


J'ai réussi à le réparer!

Dans mon application, j'ai utilisé une activité différente pour contrôler les onglets et quelle activité est affichée pour l'utilisateur. C'est la toute première activité à être affichée et je pense que c'est la seule activité affichée tout au long du programme, mais montre simplement le contenu des autres activités. Ainsi, lorsque j'ai demandé les autorisations pour MapsActivity, celle-ci ne s'affichait pas car MapsActivity n'était pas réellement présent.

Mon explication peut être fausse alors voici le code pour mon TabBarActivity:

    TabHost tabHost = getTabHost();
    TabHost.TabSpec spec;
    Intent intent;

    intent = new Intent().setClass(this, SecondActivity.class);
    spec = tabHost.newTabSpec("Second").setIndicator("Profile")
            .setContent(intent);
    tabHost.addTab(spec);

    intent = new Intent().setClass(this, MapsActivity.class);
    spec = tabHost.newTabSpec("First").setIndicator("Location")
            .setContent(intent);
    tabHost.addTab(spec);

    intent = new Intent().setClass(this, ThirdActivity.class);
    spec = tabHost.newTabSpec("Third").setIndicator("Settings")
            .setContent(intent);
    tabHost.addTab(spec);

final private int REQUEST_CODE_ASK_PERMISSIONS = 123;
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
private void requestPermission() {
    if (ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED ) {
        ActivityCompat
                .requestPermissions(MainActivity.this, new String[]{Manifest.permission.ACCESS_FINE_LOCATION}, REQUEST_CODE_ASK_PERMISSIONS);
    }
}
@Override
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
    switch (requestCode) {
        case REQUEST_CODE_ASK_PERMISSIONS:
            if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                // Permission Granted
                Toast.makeText(MainActivity.this, "Permission Granted", Toast.LENGTH_SHORT)
                        .show();
            } else {
                // Permission Denied
                Toast.makeText(MainActivity.this, "Permission Denied", Toast.LENGTH_SHORT)
                        .show();
            }
            break;
        default:
            super.onRequestPermissionsResult(requestCode, permissions, grantResults);
    }
}




runtime-permissions