2016-07-27 98 views
0

我在我的測試設備上安裝了Android N Developer預覽版,我在應用程序啓動期間要求運行時許可。Android N權限問題

但不幸的是,該應用程序不顯示警報對話框來授予權限。我使用下面的代碼:

啓動活動

public class LoginActivity extends AppCompatActivity { 
    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_login); 

     if(checkPermissions()) { 
      renderView(); 
     } 
    } 

    private boolean checkPermissions() { 

     int permissionWriteStorage = ContextCompat.checkSelfPermission(this, Manifest.permission_group.STORAGE); 
     int permissionPhoneState = ContextCompat.checkSelfPermission(this, Manifest.permission.READ_PHONE_STATE); 

     Log.i("permission",(permissionWriteStorage == PackageManager.PERMISSION_GRANTED) + ""); 
     //This prints false 

     List<String> listPermissionsNeeded = new ArrayList<>(); 
     if (permissionWriteStorage != PackageManager.PERMISSION_GRANTED) { 
      listPermissionsNeeded.add(Manifest.permission_group.STORAGE); 
     } 
     if (permissionPhoneState != PackageManager.PERMISSION_GRANTED) { 
      listPermissionsNeeded.add(Manifest.permission.READ_PHONE_STATE); 
     } 

     if (!listPermissionsNeeded.isEmpty()) { 
      Log.i("permission", "in if"); 
      //I get this in the logs 

      ActivityCompat.requestPermissions(this, listPermissionsNeeded.toArray(new String[listPermissionsNeeded.size()]),REQUEST_ID_MULTIPLE_PERMISSIONS); 
      return false; 
     } 
     return true; 
    } 
} 

的build.gradle

apply plugin: 'com.android.application' 
apply plugin: 'com.google.gms.google-services' 

android { 
    compileSdkVersion 24 
    buildToolsVersion "23.0.3" 

    defaultConfig { 
     applicationId 'com.***.***' 
     minSdkVersion 16 
     targetSdkVersion 24 
    } 
} 

編輯:溶液(1/2)

通過改變構建工具版本爲24.0.1我是ge爲READ_PHONE_STATE權限提供警報,但不允許授權組STORAGE。 我們是否需要分別詢問權限組的每個權限?

編輯2:溶液(2/2)

我管理通過與Manifest.permission.WRITE_EXTERNAL_STORAGEManifest.permission_group.STORAGE替換來解決它。根據文檔,您只需要確認整個組的一個危險許可。

用戶只需爲每個權限組授予一次權限。如果您的應用程序請求該組中的任何其他權限(列在您的應用程序清單中),系統會自動授予它們。

回答

1

我不知道,但改變的構建工具版本

android { 
compileSdkVersion 24 
buildToolsVersion "24.0.0" 

defaultConfig { 
    applicationId 'com.***.***' 
    minSdkVersion 16 
    targetSdkVersion 24 
} 
+0

將'buildtoolsVersion'更改爲'24.0。 1'幫助了我,現在我得到了'READ_PHONE_STATE'的對話框,但是沒有權限組'STORAGE' –

+0

@ Prera​​kSola,試試這個。很多時候沒有得到值(LoginActivity.this,...) – mujjuraja

+0

我能解決方法是用'Manifest.permission.WRITE_EXTERNAL_STORAGE'替換'Manifest.permission_group.STORAGE'。 –

0

用戶ActivityCompat與其使用ContextCompat

int permissionWriteStorage = ActivityCompat.checkSelfPermission(this, Manifest.permission_group.STORAGE); 
int permissionPhoneState = ActivityCompat.checkSelfPermission(this, Manifest.permission.READ_PHONE_STATE); 
+0

我不認爲這是問題,因爲使用'ContextCompat'我獲得了權限的正確值。我在第一次啓動時就得到了'假',這是正確的。 –

+0

Check listPermissionsNeeded.toArray(new String [listPermissionsNeeded.size()]正確返回String []。首先嚐試一個權限 –

+0

是的,我測試了它,它有正確的值 –

0

我知道這個技術是混亂,但爲什麼不直接使用它呢?

您也可以實現多個權限。

void getPermission(){ 
    if (ActivityCompat.checkSelfPermission(this, android.Manifest.permission.READ_PHONE_STATE) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(this, android.Manifest.permission_group.STORAGE) != PackageManager.PERMISSION_GRANTED) { 
     if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) 
      ActivityCompat.requestPermissions(Final_maps.this, 
        new String[]{android.Manifest.permission_group.STORAGE, android.Manifest.permission.READ_PHONE_STATE}, 
        CODE); 

    } 

} 

@Override 
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { 
    super.onRequestPermissionsResult(requestCode, permissions, grantResults); 
    switch (requestCode) { 
     case CODE: 
      if (grantResults.length > 0 
        && grantResults[0] == PackageManager.PERMISSION_GRANTED) { 
       setLocationEnabled(); 
       Toast.makeText(this, "Permission Granted!", Toast.LENGTH_SHORT).show(); 
      } else { 
       Toast.makeText(this, "Permission Denied!", Toast.LENGTH_SHORT).show(); 
       finish(); 
      } 
    } 
} 
0

如果您沒有實現onRequestPermissionsResult方法,則不會顯示權限警報。

+0

我已經實現了它。 –