2015-09-18 122 views
3

我有一個WebView,某個頁面加載需要GeolocationPermissions權限。爲此我重寫GeolocationPermissionsShowPrompt()。好。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); 
    } 
} 

臨屋你的幫助!

+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); 
    } 
}