我的 Android 应用程序的目标版本是 Android 13 (API 33)
WRITE_EXTERNAL_STORAGE 权限似乎在 API 33(即 Android 12 及以下版本)下运行良好,但在 Android 13 上运行应用程序时,不会出现 WRITE_EXTERNAL_STORAGE 的运行时权限弹出窗口。
我的 Android 应用程序在应用程序的私有存储中创建一个密钥库文件。
Android 13 的行为更改提到了这一点:
如果您的应用以 Android 13 为目标平台,则必须请求一项或多项新权限,而不是 READ_EXTERNAL_STORAGE。
新的权限是:
我在官方文档中没有找到任何关于此的信息。该文档仅关注媒体文件,没有提及其他文件类型。
https://developer.android.com/about/versions/13/behavior-changes-13#capsular-media-permissions
android android-manifest android-permissions runtime-permissions android-13
我想用
在单个请求中使用
ActivityCompat.requestPermissions(Activity activity,new String permisionList[],int permissionRequestcode);
Run Code Online (Sandbox Code Playgroud)
但我的问题是,我只是请求一个权限,我读了关于组权限,但它只适用于由开发人员,喜欢CONTACT_GROUP : read_contact,write_contact等决定的相同组.
我想创建自定义组权限,只向我询问一个请求并仅向我提供一个响应.
谢谢
我正在通过用户的位置
Location location = LocationServices.FusedLocationApi.getLastLocation(
mGoogleApiClient);
Run Code Online (Sandbox Code Playgroud)
这行代码在方法内部,在调用此方法之前,我会检查Android运行时权限.只有当用户可以获得权限时,我才会调用此方法.代码工作得很好.
问题是Android Studio仍然在此行上显示错误,而不是在调用此函数之前已经检查过我已经检查过.
Call requires permission which may be rejected by user: code should explicitly check to see if permission is available (with `checkPermission`) or explicitly handle a potential `SecurityException`
Run Code Online (Sandbox Code Playgroud)
现在我该如何删除此警告?我已经检查了权限,并且不想再次检查只是为了删除此警告.我已经尝试添加@SuppressWarnings(),但不知道要传递给它的确切字符串. @SuppressWarnings({"all"})有效,但显然不推荐.
如何删除此警告?
编辑1:这是我的确切代码 -
private void checkPermissions() {
if (ContextCompat.checkSelfPermission(context, Manifest.permission.ACCESS_FINE_LOCATION)
== PackageManager.PERMISSION_GRANTED)
getLocation(); //Method called if I have permission
}
private void getLocation() {
//Android studio shows warning at this line.
Location location = LocationServices.FusedLocationApi.getLastLocation(
mGoogleApiClient);
}
Run Code Online (Sandbox Code Playgroud)
但是如果我将权限检查放在getLocation()方法中,那么警告就会消失.@SuppressWarnings({"MissingPermission"})无效. …
android suppress-warnings android-studio runtime-permissions
这是我的权限
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.GET_ACCOUNTS" />
<uses-permission android:name="android.permission.READ_PROFILE" />
<uses-permission android:name="android.permission.READ_CONTACTS" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.FOREGROUND_SERVICE" />
Run Code Online (Sandbox Code Playgroud)
我做了动态许可的事情.不过,我收到了这个错误.
因此,当我在developer.android 站点中读到时,它Android 13在“权限”字段中带来了新的更改。
我有一个聊天应用程序,我需要拨打电话、打开相机、录制音频、在外部存储中读取和写入。因此,在 SplashScreen 中,我向用户请求这些权限。然而,其中一些没有被授予,但甚至系统也没有向我索要这些。
AndroidManifest.xml这是我在文件中声明的内容
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools">
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<uses-permission android:name="com.google.android.c2dm.permission.RECEIVE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.RECORD_AUDIO" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.VIBRATE" />
<uses-permission android:name="android.permission.USE_FULL_SCREEN_INTENT" />
<uses-permission android:name="android.permission.CAMERA" />
<uses-permission android:name="android.permission.CHANGE_NETWORK_STATE" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS" />
<uses-permission android:name="android.permission.BLUETOOTH" />
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN" />
<uses-permission android:name="android.permission.BLUETOOTH_CONNECT" />
<uses-permission android:name="android.permission.FOREGROUND_SERVICE" />
<uses-permission android:name="android.permission.WAKE_LOCK" />
<uses-permission android:name="com.google.android.gms.permission.AD_ID"/>
<uses-permission android:name="android.permission.POST_NOTIFICATIONS"/>
<uses-feature
android:name="android.hardware.camera"
android:required="true" />
<uses-feature android:name="android.hardware.camera.autofocus" />
<uses-feature
android:glEsVersion="0x00020000" …Run Code Online (Sandbox Code Playgroud) 在迁移我的某个应用程序以使用Android 6.0权限系统时,我发现使用模拟器调试权限非常困难.
发现:
requestPermissions()方法时,禁用应用信息屏幕中的权限不会重新显示授予权限对话框.使用Android模拟器调试权限的正确方法是什么?
android android-permissions android-debug android-6.0-marshmallow runtime-permissions
我正在尝试实现 Marshmallow 的权限支持,但我在“onRequestPermissionsResult”中的代码从未被调用。
在 Activity 中工作时,它的工作正常但在片段中我遇到了问题,即控件没有进入 onRequestPermissionsResult()
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
mCheckPermission();
}
Run Code Online (Sandbox Code Playgroud)
在 mCheckPermission() 中:-
public void mCheckPermission() {
if (ContextCompat.checkSelfPermission(getActivity(), Manifest.permission.ACCESS_FINE_LOCATION)
!= PackageManager.PERMISSION_GRANTED || ContextCompat.checkSelfPermission(getActivity(),
Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
requestPermissions(new String[]{Manifest.permission.ACCESS_FINE_LOCATION, Manifest.permission.ACCESS_COARSE_LOCATION},
PERMISSION_REQUEST_COARSE_LOCATION );
}
}
Run Code Online (Sandbox Code Playgroud)
对话框弹出 2 个按钮。拒绝和允许。单击按钮时,控件未进入 onRequestPermissionCheck();
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
switch (requestCode){
case PERMISSION_REQUEST_COARSE_LOCATION: {
if (grantResults.length > 0
&& grantResults[0] == PackageManager.PERMISSION_GRANTED) {
Toast.makeText(getActivity(), "permission granted", Toast.LENGTH_LONG).show();
//call your action
} …Run Code Online (Sandbox Code Playgroud) android android-fragments android-runtime runtime-permissions
我正在测试我的应用程序Marshmallow 6.0,它正在关闭android.permission.READ_EXTERNAL_STORAGE,即使已经在Manifest中定义了它.在某处我读过,如果我在运行时请求权限,那么它就不会强行关闭你的应用程序.我也读过这个android文档,用于请求运行时权限.
所以,我开始知道我们可以请求android文档中提到的下面的权限.
// Here, thisActivity is the current activity
if (ContextCompat.checkSelfPermission(thisActivity,
Manifest.permission.READ_CONTACTS)
!= PackageManager.PERMISSION_GRANTED) {
// Should we show an explanation?
if (ActivityCompat.shouldShowRequestPermissionRationale(thisActivity,
Manifest.permission.READ_CONTACTS)) {
// Show an expanation to the user *asynchronously* -- don't block
// this thread waiting for the user's response! After the user
// sees the explanation, try again to request the permission.
} else {
// No explanation needed, we can request the permission.
ActivityCompat.requestPermissions(thisActivity,
new String[]{Manifest.permission.READ_CONTACTS},
MY_PERMISSIONS_REQUEST_READ_CONTACTS); …Run Code Online (Sandbox Code Playgroud) 我正在尝试从Android拨打电话,我也设置了运行时权限.它询问是否允许拨打电话.但是当我按下允许时,应用程序崩溃了:
这是我实现它的方式:
private static final int REQUEST_PHONE_CALL = 1;
Intent intent = new Intent(Intent.ACTION_CALL, Uri.parse("tel:" + "+918511812660"));
if (android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
if (ContextCompat.checkSelfPermission(MainActivity.this, Manifest.permission.CALL_PHONE) != PackageManager.PERMISSION_GRANTED) {
ActivityCompat.requestPermissions(MainActivity.this, new String[]{Manifest.permission.CALL_PHONE},REQUEST_PHONE_CALL);
}
else
{
startActivity(intent);
}
}
else
{
startActivity(intent);
}
Run Code Online (Sandbox Code Playgroud)
@Override
public void onRequestPermissionsResult(int requestCode,
String permissions[], int[] grantResults) {
switch (requestCode) {
case REQUEST_PHONE_CALL: {
if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
startActivity(intent);
}
else
{
}
return;
}
}
}
Run Code Online (Sandbox Code Playgroud)
这是我在logcat中获得的:
java.lang.RuntimeException: Failure delivering result …Run Code Online (Sandbox Code Playgroud) 我正在更新我的应用程序以兼容Android 6.权限模型在理论上并不复杂,但现在我正在实现它,我发现自己在每个需要权限的活动中编写了相同的丑陋样板代码.
对于我需要的每一个许可,都有一个
if (ActivityCompat.checkSelfPermission(this, Manifest.permission.PERMISSION) !=
PackageManager.PERMISSION_GRANTED) {
} else {
}
Run Code Online (Sandbox Code Playgroud)
然后在onRequestPermissionsResult我必须检查/过滤每个请求的结果并将其转换为我的活动理解的内容.
我现在正在更新我的第二个活动,并且权限代码与第一个类似,它几乎看起来像是复制粘贴的.线条很长,代码很相似,看起来很丑陋.
我不想使用第三方解决方案,我尝试了一些,但我更愿意完全控制代码.例如,某些库不支持我在项目中使用的Java 8.
我可以做些什么来避免在我的所有活动中出现一堆重复的代码?
android android-permissions android-6.0-marshmallow runtime-permissions