0

我的测试设备上有 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;
    }
}

构建.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.STORAGEManifest.permission.WRITE_EXTERNAL_STORAGE。根据文档,您只需要确认整个组的一项危险权限。

用户只需为每个权限组授予一次权限。如果您的应用请求该组中的任何其他权限(在您的应用清单中列出),系统会自动授予它们。

4

5 回答 5

1

我不确定,但更改了构建工具版本

android {
compileSdkVersion 24
buildToolsVersion "24.0.0"

defaultConfig {
    applicationId 'com.***.***'
    minSdkVersion 16
    targetSdkVersion 24
}
于 2016-07-27T09:09:17.753 回答
0

用户 ActivityCompat 而不是 ContextCompat

int permissionWriteStorage = ActivityCompat.checkSelfPermission(this, Manifest.permission_group.STORAGE);
int permissionPhoneState = ActivityCompat.checkSelfPermission(this, Manifest.permission.READ_PHONE_STATE);
于 2016-07-27T09:08:25.230 回答
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();
            }
    }
}
于 2016-07-27T09:11:46.673 回答
0

如果您不实现 onRequestPermissionsResult 方法,则不会显示权限警报。

于 2016-07-27T09:29:28.677 回答
0

在清单中给予许可

<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) {


        }
    }

}
于 2019-10-02T10:45:18.310 回答