项目中通过ActivityCompat.requestPermissions(thisActivity, permissions, requestCode)方法发起权限请求,但是一直没有权限弹窗,且logcat报错:
Caused by: java.lang.SecurityException: Permission Denial: updateConfiguration() from pid=29692, uid=10219 requires android.permission.CHANGE_CONFIGURATION
如下是AndroidManifest.xml文件
网上说需要root设置或者设置为系统应用才能获取到CHANGE_CONFIGURATION,请问还有别的办法获取到CHANGE_CONFIGURATION权限吗
(备注:目前在做通过app内部设置来修改系统语言)
根据之前提供的AndroidManifest.xml文件,我帮您修改了一下权限声明,删除了不必要的系统级权限声明,并对其中重复声明的权限进行了处理。同时,我将在代码部分提供一个权限请求的示例。
修改后的AndroidManifest.xml文件:
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
package="com.jz.settings"
android:sharedUserId="android.uid.system">
<!-- 删除重复声明的权限 -->
<uses-permission android:name="android.permission.BLUETOOTH_CONNECT"/>
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN"/>
<uses-permission android:name="android.permission.BLUETOOTH"/>
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>
<uses-permission android:name="android.permission.CHANGE_WIFI_MULTICAST_STATE"/>
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE"/>
<uses-permission android:name="android.permission.READ_CONTACTS"/>
<!-- 删除不必要的系统级权限声明 -->
<!-- <uses-permission android:name="android.permission.CHANGE_CONFIGURATION" tools:ignore="ProtectedPermissions"/> -->
<!-- <uses-permission android:name="android.permission.WRITE_SECURE_SETTINGS" tools:ignore="ProtectedPermissions"/> -->
<!-- 保留必要的uses-feature声明 -->
<uses-feature android:name="android.hardware.bluetooth_le" android:required="true"/>
<!-- 其他内容... -->
</manifest>
示例权限请求代码:
import android.Manifest;
import android.content.pm.PackageManager;
import android.os.Bundle;
import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.app.ActivityCompat;
import androidx.core.content.ContextCompat;
public class MainActivity extends AppCompatActivity {
// 请求权限的请求码
private static final int REQUEST_CODE_PERMISSIONS = 100;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// 检查权限是否已经被授予
if (ContextCompat.checkSelfPermission(this,
Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
// 权限未被授予,请求权限
ActivityCompat.requestPermissions(this,
new String[]{Manifest.permission.ACCESS_FINE_LOCATION},
REQUEST_CODE_PERMISSIONS);
} else {
// 权限已经被授予,执行需要权限的操作
// 在这里执行需要权限的代码
}
}
@Override
public void onRequestPermissionsResult(int requestCode,
@NonNull String[] permissions,
@NonNull int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
if (requestCode == REQUEST_CODE_PERMISSIONS) {
// 权限请求结果回调
if (grantResults.length > 0 &&
grantResults[0] == PackageManager.PERMISSION_GRANTED) {
// 权限已经被授予,执行需要权限的操作
// 在这里执行需要权限的代码
} else {
// 权限被拒绝,可以做相应的处理
}
}
}
}
以上代码是一个示例,用于在Activity启动时检查并请求ACCESS_FINE_LOCATION权限。您可以根据实际需要修改请求的权限和相应的逻辑。
请确保修改后的AndroidManifest.xml文件和示例代码都正确并放置在正确的位置。如果问题仍然存在,请提供更多代码或错误信息,以便我能更准确地帮助您解决问题。