2015-09-18 4 views
3

У меня есть WebView, и для загрузки некоторых страниц требуется разрешение для GeolocationPermissions. Для этого я переопределяю onGeolocationPermissionsShowPrompt(). ОК.Android M: Системное разрешение против разрешения на размещение WebView

Кроме того, мое приложение предназначено для SDK 23 (Android M) с новой моделью разрешений. Итак, мне нужно проверить, предоставил ли пользователь разрешение ACCESS_FINE_LOCATION, а если нет, отобразите диалоговое окно с запросом разрешения.

Как показать это диалоговое окно только для страниц, требующих GeolocationPermissions?

Обратный вызов onPermissionRequest (запрос PermissionRequest) не вызывается.

AndroidManifest:

WebView обратные вызовы

@Override 
public void onGeolocationPermissionsShowPrompt(String origin, GeolocationPermissions.Callback callback) { 
    callback.invoke(origin, true, true); 
    super.onGeolocationPermissionsShowPrompt(origin, callback); 
} 

@Override 
public void onPermissionRequest(PermissionRequest request) { 
    if (ActivityCompat.checkSelfPermission(getActivity(), Manifest.permission.ACCESS_FINE_LOCATION)!= PackageManager.PERMISSION_GRANTED){ 
     requestLocationPermission(); 
    else { 
     super.onPermissionRequest(request); 
    } 

Диалог разрешения

private void requestLocationPermission() { 
    if (ActivityCompat.shouldShowRequestPermissionRationale(getActivity(), Manifest.permission.ACCESS_FINE_LOCATION)) { 
     new ADPDialogFragment(getActivity()) { 
     @Override 
     public String getTitre() { 
      return getString(R.string.mob_he_configuration_dialogue_message_titre); 
     } 

     @Override 
     public String getMessage() { 
      return getString(R.string.permission_location_rationale); 
     } 

     @Override 
     public void doPositiveClick() { 
      ActivityCompat.requestPermissions(getActivity(), new String[]{Manifest.permission.ACCESS_FINE_LOCATION}, REQUEST_LOCATION); 
     } 
    }.show(getFragmentManager(), TAG); 
} else { 
    ActivityCompat.requestPermissions(getActivity(), new String[]{Manifest.permission.ACCESS_FINE_LOCATION}, REQUEST_LOCATION); 
} 

Разрешение обратного

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

    if (requestCode == REQUEST_LOCATION) { 
     // BEGIN_INCLUDE(permission_result) 
     // Received permission result for camera permission. 
     Log.i(TAG, "Received response for Camera permission request."); 

     // Check if the only required permission has been granted 
     if (grantResults.length == 1 && grantResults[0] == PackageManager.PERMISSION_GRANTED) { 
      // Camera permission has been granted, preview can be displayed 

     } else { 
      Toast.makeText(getActivity(), getString(R.string.permissions_not_granted), Toast.LENGTH_SHORT).show(); 

     } 
     // END_INCLUDE(permission_result) 

    } else { 

     super.onRequestPermissionsResult(requestCode, permissions, grantResults); 
    } 
} 

Tha nks за вашу помощь!

+0

ли вы заставить его работать в Android SDK 23 ? Я не могу, это как callback.invoke ничего не делает ... –

ответ

4

Вы можете попросить разрешения пользователя, когда onGeolocationPermissionsShowPrompt называется:

@Override 
public void onGeolocationPermissionsShowPrompt(String origin, GeolocationPermissions.Callback callback) { 
    if (ActivityCompat.checkSelfPermission(getActivity(), Manifest.permission.ACCESS_FINE_LOCATION)!= PackageManager.PERMISSION_GRANTED) { 
     mCallback = callback; 
     mOrigin = origin; 
     requestLocationPermission(); 
    } else { 
     callback.invoke(origin, true, true); 
    } 
} 

и когда пользователь выбирает предоставить вам разрешение или нет:

@Override 
public void onRequestPermissionsResult(int requestCode, 
             @NonNull String[] permissions, 
             @NonNull int[] grantResults) 
{ 
    switch (requestCode) { 
    case REQUEST_LOCATION: 
     if (mCallback != null && mOrigin != null) 
      mCallback.invoke(mOrigin, 
          grantResults.length == 1 && grantResults[0] == PackageManager.PERMISSION_GRANTED, 
          false); 
     mCallback = null; 
     mOrigin = null; 
     break; 

    default: 
     super.onRequestPermissionsResult(requestCode, permissions, 
             grantResults); 
    } 
} 
Смежные вопросы