[英]Android N permission Issue
我的測試設備上裝有Android N Developer預覽版,我正在啟動應用程序時要求運行時權限。
但不幸的是,該應用程序未顯示警告對話框來授予權限。 我正在使用以下代碼:
啟動器活動
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
我收到有關READ_PHONE_STATE
權限的警報,但沒有有關權限組STORAGE
的警報。 我們是否需要分別詢問權限組的每個權限?
編輯2:解決方案(2/2)
我設法通過更換來解決它Manifest.permission_group.STORAGE
與Manifest.permission.WRITE_EXTERNAL_STORAGE
。 根據文檔,您只需要確認整個小組的一項危險許可即可。
用戶只需要為每個權限組授予一次權限。 如果您的應用請求該組(應用清單中列出)中的任何其他權限,則系統會自動授予它們。
我不確定,但更改了構建工具的版本
android {
compileSdkVersion 24
buildToolsVersion "24.0.0"
defaultConfig {
applicationId 'com.***.***'
minSdkVersion 16
targetSdkVersion 24
}
用戶ActivityCompat而不是ContextCompat
int permissionWriteStorage = ActivityCompat.checkSelfPermission(this, Manifest.permission_group.STORAGE);
int permissionPhoneState = ActivityCompat.checkSelfPermission(this, Manifest.permission.READ_PHONE_STATE);
我知道這項技術比較麻煩,但是為什么不簡單使用呢?
您也可以實現多個權限。
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();
}
}
}
如果您未實現onRequestPermissionsResult方法,則不會顯示權限警報。
在清單中給予許可
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
然后將代碼粘貼到“活動”中
private void getPermission() {
if (ContextCompat.checkSelfPermission(MapsActivity.this, Manifest.permission.ACCESS_FINE_LOCATION) !=
PackageManager.PERMISSION_GRANTED) {
if (ContextCompat.checkSelfPermission(MapsActivity.this, Manifest.permission.ACCESS_COARSE_LOCATION) !=
PackageManager.PERMISSION_GRANTED) {
ActivityCompat.requestPermissions(MapsActivity.this, new String[]{Manifest.permission.ACCESS_FINE_LOCATION, Manifest.permission.ACCESS_COARSE_LOCATION}, 0);
}
}
}
也調用此覆蓋方法
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
if (requestCode == PERMISSION_REQUEST_CODE) {
if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED
&& grantResults[1] == PackageManager.PERMISSION_GRANTED) {
}
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.