4

Я пытаюсь запросить разрешения ACCESS_FINE_LOCATION, чтобы получить текущее местоположение пользователя.ActivityCompat.requestPermissions не отображает приглашение

My logging указывает, что мое приложение в настоящее время не имеет этого разрешения при запросе ContextCompat.checkSelfPermission(), но при вызове ActivityCompat.requestPermissions() ничего не отображается.

Код моей карты Google (реализация OnMapReadyCallback и ActivityCompat.OnRequestPermissionsResultCallback()) находится в FragmentActivity.

Мне удалось получить функцию requestPermissions(), успешно работающую в других действиях в приложении, это только та, что с картой Google. Он не работает при размещении в методе onCreate()Activity или в onMapReady() (там, где он должен идти).

if(ContextCompat.checkSelfPermission(LocationActivity.this, android.Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED) { 
     Log.d(TAG, "not granted"); 
     final String[] permissions = new String[] {android.Manifest.permission.ACCESS_FINE_LOCATION}; 
    if(ActivityCompat.shouldShowRequestPermissionRationale(this, android.Manifest.permission.ACCESS_FINE_LOCATION)) { 
      Log.d(TAG, "rationale"); 
      // Explain to the user why permission is required, then request again 
      AlertDialog.Builder builder = new AlertDialog.Builder(this); 
      builder.setMessage("We need permissions") 
        .setCancelable(false) 
        .setPositiveButton("OK", new DialogInterface.OnClickListener() { 
         public void onClick(DialogInterface dialog, int id) { 
          ActivityCompat.requestPermissions(LocationActivity.this, permissions, 1); 
        } 
       }); 
     AlertDialog alert = builder.create(); 
     alert.show(); 

    } else { 
     Log.d(TAG, "request" + android.Manifest.permission.ACCESS_FINE_LOCATION); 
     // If permission has not been denied before, request the permission 
     ActivityCompat.requestPermissions(LocationActivity.this, permissions, 1); 
    } 
} else { 
    Log.d(TAG, "granted"); 
} 

Любые идеи? Это как-то связано с классом моей деятельности (FragmentActivity) или возможно, что карта Google, вызывающая запрос разрешений асинхронно?

+0

Я удивлен, что это скомпилировано. 'checkSelfPermission()' использует 'LocationActivity.this'. Второй 'requestPermissions()' использует 'PermissionsRequestActivity.this'. – CommonsWare

+0

Простите, да, мне пришлось немного изменить свой код для публикации, второй должен быть LocationActivity.this – Robin

+0

Я пытался сделать все requestPermissions в отдельном Activity, но это делает обратный вызов сложным и хакерским. – Robin

ответ

8

После полного удаления моего класса, и он все еще не работает, я понял, что эта активность создается с помощью TabHost.

Когда я перестаю использовать TabHost, приглашение отображается успешно. Я думаю, что TabHosts не поддерживаются новыми разрешениями - это ошибка?

Такая же проблема, как App requests aren't showing up

Я в конечном итоге создать PermissionsRequestActivity, который обрабатывает запрос на разрешение и ответ от имени моего TabHost, затем выходит (передать запрашиваемую информацию разрешения через Намерение статистов Bundle).
Он передает ответ на запрос в виде широковещательной передачи, которая подхвачена моей TabHost.

Немного взлома, но работает нормально!

+0

Да! Тоже самое. – Hilal

+0

Ditto - использование TabHost, и это не показывается для меня. Кто-нибудь знает, как обращаться? – AlexVPerl

+0

В результате я создал PermissionsRequestActivity, который обрабатывает запрос на разрешение и ответ от имени моей TabHost, а затем завершает работу (передайте запрошенную информацию о разрешении через пакет дополнительных возможностей Intent). Он передает ответ на запрос в виде трансляции, которая подхвачена моей TabHost. Немного взлома, но работает нормально! – Robin

0

Убедитесь, что вы уже добавили запрашиваемое разрешение в файл манифеста Android, например, до Android M, только тогда вы получите ожидаемое поведение.

Добавьте разрешение на манифест, так что вы можете запросить его через ActivityCompat.requestPermissions:

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

Спасибо, у меня было это; в другом месте приложения запрос разрешения успешно показывался. Я нашел причину, см. Мой ответ выше. – Robin

0

поделится код, который работает для меня. В защищенном ничтожной OnCreate (Bundle savedInstanceState) {} Метод моей деятельности, где я хочу, чтобы увидеть подсказку, я включил этот код:

/* Check whether the app has the ACCESS_FINE_LOCATION permission and whether the app op that corresponds to 
    * this permission is allowed. The return value is an int: The permission check result which is either 
    * PERMISSION_GRANTED or PERMISSION_DENIED or PERMISSION_DENIED_APP_OP. 
    * Source: https://developer.android.com/reference/android/support/v4/content/PermissionChecker.html 
    * While testing, the return value is -1 when the "Your location" permission for the App is OFF, and 1 when it is ON. 
    */ 
    int permissionCheck = ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION); 
    // The "Your location" permission for the App is OFF. 
    if (permissionCheck == -1){ 
     /* This message will appear: "Allow [Name of my App] to access this device's location?" 
     * "[Name of my Activity]._instance" is the activity. 
     */ 
     ActivityCompat.requestPermissions([Name of my Activity]._instance, new String[]{Manifest.permission.ACCESS_FINE_LOCATION}, REQUEST_CODE_ACCESS_FINE_LOCATION); 
    }else{ 
     // The "Your location" permission for the App is ON. 
     if (permissionCheck == 0){ 
     } 
    } 

Перед защищаемый недействительным OnCreate (Bundle savedInstanceState) {} метода, я создал следующая константа и метод:

public static final int REQUEST_CODE_ACCESS_FINE_LOCATION = 1; // For implementation of permission requests for Android 6.0 with API Level 23. 

// Code from "Handle the permissions request response" at https://developer.android.com/training/permissions/requesting.html. 
@Override 
public void onRequestPermissionsResult(int requestCode, 
             String permissions[], int[] grantResults) { 
    switch (requestCode) { 
     case REQUEST_CODE_ACCESS_FINE_LOCATION: { 
      // If request is cancelled, the result arrays are empty. 
      if (grantResults.length > 0 
        && grantResults[0] == PackageManager.PERMISSION_GRANTED) { 

       // permission was granted, yay! Do the 
       // location-related task you need to do.     

      } else { 

       // permission denied, boo! Disable the 
       // functionality that depends on this permission. 
      } 
      return; 
     } 

     // other 'case' lines to check for other 
     // permissions this app might request 
    } 
} 
0

Я столкнулся с той же проблемой в проекте, который использует TabHost. Основа на решении @Robin, я использую библиотеку EventBus для отправки сообщения от дочерней активности в TabActity.

EventBus: https://github.com/greenrobot/EventBus

Создать объект события:

public class MessageEvent { 
    private String message; 
    public MessageEvent(String message){ 
     this.message = message; 
    } 

    public String getMessage(){ 
     return this.message; 
    } 
} 

В вашей основной деятельности:

private EventBus eventBus = EventBus.getDefault(); 
@Override 
protected void onCreate(Bundle savedInstanceState) { 
    eventBus.register(this); 
} 
@Override 
protected void onDestroy() { 
    eventBus.unregister(this); 
    super.onDestroy(); 
} 
@Subscribe(threadMode = ThreadMode.MAIN) 
public void onMessageEvent(MessageEvent event) { 
    if (event.getMessage().equals("contacts")){ 
     if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M && checkSelfPermission(android.Manifest.permission.WRITE_CONTACTS) != PackageManager.PERMISSION_GRANTED) { 
      ActivityCompat.requestPermissions(MainPage.this,new String[]{android.Manifest.permission.WRITE_CONTACTS}, 100); 
     } 
    } 
}; 

Установить другое сообщение для разрешения хочешь просить. В вашей детской деятельности вы можете чем опубликовать соответствующее сообщение:

EventBus.getDefault().post(new MessageEvent("contacts")); 

быть в курсе onRequestPermissionsResult обратного вызова и код запроса;)! Он будет работать только в основной деятельности.

Смежные вопросы