2016-01-27 3 views
2

У меня есть следующие разрешения в моем приложении для устройств Andorid M. Я тестировал это на 6.0.0 и 6.0.1, и получаю те же результаты как на Nexus 5X, так и на Nexus 6P. В основном каждое разрешение возвращает неверные результаты, и когда я включаю/выключаю их, результат не изменяется.Разрешения Android M, возвращать неверный результат

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

Manifest Права доступа:

<uses-permission android:name="android.permission.CALL_PHONE" /> 
    <uses-permission android:name="android.permission.VIBRATE" /> 
    <uses-permission android:name="android.permission.READ_PHONE_STATE" /> 
    <uses-permission android:name="android.permission.INTERNET" /> 
    <uses-permission android:name="android.permission.NFC" /> 
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> 
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> 
    <uses-permission android:name="android.permission.BIND_NFC_SERVICE" /> 
    <uses-permission android:name="com.samsung.android.providers.context.permission.WRITE_USE_APP_FEATURE_SURVEY" /> 
    <uses-permission android:name="android.permission.RECEIVE" /> 
    <uses-permission android:name="com.google.android.c2dm.permission.RECEIVE" /> 
    <uses-permission android:name="android.permission.WAKE_LOCK" /> 
    <uses-permission android:name="com.simplytapp.virtualcard.permission.C2D_MESSAGE" /> 
    <uses-permission android:name="android.permission.READ_CONTACTS" /> 
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /> 

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

MainActivity:

private static final String[] CHECK_PERMISSIONS = { 
       Manifest.permission.READ_PHONE_STATE, 
       Manifest.permission.CALL_PHONE, 
       Manifest.permission.READ_CALL_LOG, 
       Manifest.permission.WRITE_CALL_LOG, 
       Manifest.permission.USE_SIP, 
       Manifest.permission.PROCESS_OUTGOING_CALLS, 
       Manifest.permission.CALL_PRIVILEGED, 
       Manifest.permission.MODIFY_PHONE_STATE, 
       Manifest.permission.VIBRATE, 
       Manifest.permission.INTERNET, 
       Manifest.permission.NFC, 
       Manifest.permission.ACCESS_NETWORK_STATE, 
       Manifest.permission.WRITE_EXTERNAL_STORAGE, 
       Manifest.permission.BIND_NFC_SERVICE, 
       Manifest.permission.WAKE_LOCK, 
       Manifest.permission.READ_CONTACTS, 
       Manifest.permission.READ_EXTERNAL_STORAGE, 
       Manifest.permission.ACCESS_FINE_LOCATION 
     }; 

     for (int i = 0; i < CHECK_PERMISSIONS.length; i++) { 
      permissionsController.checkAccessPermissions(0, CHECK_PERMISSIONS[i]);  
     } 

     public boolean checkAccessPermissions(int statusCode, String permission) { 
      boolean granted = true; 
      if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { 
       if (ActivityCompat.checkSelfPermission(mContext, permission) != PackageManager.PERMISSION_GRANTED) { 
       granted = false; 
       } 
      } 

      Log.i("Permissions Check", "Permission: " + permission + " - has status: " + granted); 

      return granted; 
     } 

Это всегда будет возвращать те же результат погодные разрешения предоставляются или нет.

Permissions Check: Permission: android.permission.READ_PHONE_STATE - has status: true 
Permissions Check: Permission: android.permission.CALL_PHONE - has status: true 
Permissions Check: Permission: android.permission.READ_CALL_LOG - has status: false 
Permissions Check: Permission: android.permission.WRITE_CALL_LOG - has status: false 
Permissions Check: Permission: android.permission.USE_SIP - has status: false 
Permissions Check: Permission: android.permission.PROCESS_OUTGOING_CALLS - has status: false 
Permissions Check: Permission: android.permission.CALL_PRIVILEGED - has status: false 
Permissions Check: Permission: android.permission.MODIFY_PHONE_STATE - has status: false 
Permissions Check: Permission: android.permission.VIBRATE - has status: true 
Permissions Check: Permission: android.permission.INTERNET - has status: true 
Permissions Check: Permission: android.permission.NFC - has status: true 
Permissions Check: Permission: android.permission.ACCESS_NETWORK_STATE - has status: true 
Permissions Check: Permission: android.permission.WRITE_EXTERNAL_STORAGE - has status: true 
Permissions Check: Permission: android.permission.BIND_NFC_SERVICE - has status: false 
Permissions Check: Permission: android.permission.WAKE_LOCK - has status: true 
Permissions Check: Permission: android.permission.READ_CONTACTS - has status: true 
Permissions Check: Permission: android.permission.READ_EXTERNAL_STORAGE - has status: true 
Permissions Check: Permission: android.permission.ACCESS_FINE_LOCATION - has status: true 
+0

Что вы 'targetSdkVersion'? – CommonsWare

ответ

0

Либо вам нужно скомпилировать приложение для целевого api 22, либо вы должны запросить разрешения во время выполнения. См.: http://developer.android.com/training/permissions/requesting.html

+0

Мне удалось решить проблему с двумя основными проблемами. целевому sdk должно быть 23, а код запроса для каждого разрешения должен быть другим. Я буду отмечать это как правильно, так как это привело меня к ответу, однако, если вы посмотрели на код, который я опубликовал, я запрашиваю разрешения во время выполнения. – ahmad

0

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

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M && getActivity().checkSelfPermission(Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED && getActivity().checkSelfPermission(Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED) { 
    if(!shouldShowRequestPermissionRationale(Manifest.permission.ACCESS_FINE_LOCATION)) { 
      alertOpenSetting(); 
    }else { 
      checkLocationPermission(); 
      ActivityCompat.requestPermissions(getActivity(), new String[]{Manifest.permission.ACCESS_FINE_LOCATION}, REQUEST_CODE_ASK_PERMISSIONS); 
    } 
} 


public boolean checkLocationPermission() 
{ 
    String permission = "android.permission.ACCESS_FINE_LOCATION"; 
    int res = getActivity().checkCallingOrSelfPermission(permission); 
    return (res == PackageManager.PERMISSION_GRANTED); 
} 

@Override 
public void onRequestPermissionsResult(int requestCode, String permissions[], int[] grantResults) { 
    switch (requestCode) { 
     case 0: { 
      //null or 0 
     } 
     case 1: { 
      if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) { 
       insertPermissionWrapper(); 
       NetworkManager.getInstance().startLocationService(); 
      }else { 
       //denied 
      } 
      return; 
     } 
     default: 
      super.onRequestPermissionsResult(requestCode, permissions, grantResults); 
    } 
} 


private void alertOpenSetting() { 
    AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder(getActivity()); 
    alertDialogBuilder.setTitle("Location, Storage and Telephone permissions are required to use this app."); 
    alertDialogBuilder.setMessage("Please enable these permissions in Permissions under app settings."); 
    alertDialogBuilder.setNegativeButton("Go to setting", new DialogInterface.OnClickListener() { 
     public void onClick(DialogInterface dialog, int id) { 
      goToSettings(); 
     } 
    }); 
    alertDialogBuilder.create(); 
    alertDialogBuilder.show(); 
} 

Надеюсь, это ПОМОГАЕТ

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