Xamarin开发Android应用:华为设备启动应用设置权限异常求助
问题描述
使用Xamarin开发Android应用,需打开应用设置页面完成选项勾选操作,该功能在小米设备上运行正常,但在华为设备上出现权限异常。
调用华为系统管理页面的代码
try { Intent intent = new Intent(); intent.SetComponent("com.huawei.systemmanager", "com.huawei.systemmanager.appcontrol.activity.StartupAppControlActivity"); // huawei // intent.SetComponent(new ComponentName("com.miui.securitycenter", "com.miui.appmanager.ApplicationsDetailsActivity")); // xiaomy intent.PutExtra("package_name", PackageName); StartActivity(intent); } catch (Exception anfe) { }
异常栈信息
{Java.Lang.SecurityException: Permission Denial: starting Intent { cmp=com.huawei.systemmanager/.appcontrol.activity.StartupAppControlActivity (has extras) } from ProcessRecord{2f6f6d7 8007:com.companyname.corporate_messenger/u0a410} (pid=8007, uid=10410) requires com.huawei.permission.external_app_settings.USE_COMPONENT ---> Android.OS.RemoteException: Remote stack trace: at com.android.server.wm.ActivityStackSupervisor.checkStartAnyActivityPermission(ActivityStackSupervisor.java:1209) at com.android.server.wm.ActivityStarter.startActivity(ActivityStarter.java:924) at com.android.server.wm.ActivityStarter.startActivity(ActivityStarter.java:674) at com.android.server.wm.HwActivityStarter.startActivity(HwActivityStarter.java:278) at com.android.server.wm.ActivityStarter.startActivityMayWait(ActivityStarter.java:1737) callee: null 1665/2209 --- End of inner exception stack trace --- at Java.Interop.JniEnvironment+InstanceMethods.CallNonvirtualVoidMethod (Java.Interop.JniObjectReference instance, Java.Interop.JniObjectReference type, Java.Interop.JniMethodInfo method, Java.Interop.JniArgumentValue* args) [0x0008e] in <00c315a988634383b446eff646084784>:0 at Java.Interop.JniPeerMembers+JniInstanceMethods.InvokeVirtualVoidMethod (System.String encodedMember, Java.Interop.IJavaPeerable self, Java.Interop.JniArgumentValue* parameters) [0x00063] in <00c315a988634383b446eff646084784>:0 at Android.Content.ContextWrapper.StartActivity (Android.Content.Intent intent) [0x00027] in /Users/builder/azdo/_work/1/s/xamarin-android/src/Mono.Android/obj/Release/monoandroid10/android-29/mcw/Android.Content.ContextWrapper.cs:3364 at Corporate_messenger.Droid.MainActivity.SetPermission (System.String param1, System.String param2) [0x00028] in D:\Project\Xamarin\Messanger\Corporate messenger\Corporate messenger.Android\MainActivity.cs:103 --- End of managed Java.Lang.SecurityException stack trace --- java.lang.SecurityException: Permission Denial: starting Intent { cmp=com.huawei.systemmanager/.appcontrol.activity.StartupAppControlActivity (has extras) } from ProcessRecord{2f6f6d7 8007:com.companyname.corporate_messenger/u0a410} (pid=8007, uid=10410) requires com.huawei.permission.external_app_settings.USE_COMPONENT at android.os.Parcel.createException(Parcel.java:2091) at android.os.Parcel.readException(Parcel.java:2059) at android.os.Parcel.readException(Parcel.java:2007) at android.app.IActivityTaskManager$Stub$Proxy.startActivity(IActivityTaskManager.java:3908) at android.app.Instrumentation.execStartActivity(Instrumentation.java:1738) at android.app.Activity.startActivityForResult(Activity.java:5412) at androidx.activity.ComponentActivity.startActivityForResult(ComponentActivity.java:597) at android.app.Activity.startActivityForResult(Activity.java:5337) at androidx.activity.ComponentActivity.startActivityForResult(ComponentActivity.java:583) at android.app.Activity.startActivity(Activity.java:5819) at android.app.Activity.startActivity(Activity.java:5787) at crc6480b75fa72058fc63.MainActivity.n_onCreate(Native Method) at crc6480b75fa72058fc63.MainActivity.onCreate(MainActivity.java:40) at android.app.Activity.performCreate(Activity.java:8214) at android.app.Activity.performCreate(Activity.java:8202) at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1320) at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:4033) at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:4247) at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:91) at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:149) at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:103) at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2613) at android.os.Handler.dispatchMessage(Handler.java:110) at android.os.Looper.loop(Looper.java:219) at android.app.ActivityThread.main(ActivityThread.java:8668) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:513) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1109) Caused by: android.os.RemoteException: Remote stack trace: at com.android.server.wm.ActivityStackSupervisor.checkStartAnyActivityPermission(ActivityStackSupervisor.java:1209) at com.android.server.wm.ActivityStarter.startActivity(ActivityStarter.java:924) at com.android.server.wm.ActivityStarter.startActivity(ActivityStarter.java:674) at com.android.server.wm.HwActivityStarter.startActivity(HwActivityStarter.java:278) at com.android.server.wm.ActivityStarter.startActivityMayWait(ActivityStarter.java:1737) callee: null 1665/2209 }
应用原本可自行打开此页面,问题仅出现在华为设备上,后续计划通过Xamarin将功能扩展至iOS平台,需解决华为设备上的权限异常问题。
解决方案
1. 添加华为专属权限
在AndroidManifest.xml中声明华为要求的权限:
<uses-permission android:name="com.huawei.permission.external_app_settings.USE_COMPONENT" />
2. 改用通用跳转方式(推荐)
放弃调用华为私有组件,改用系统标准API跳转应用自身设置页面,避免厂商私有接口的兼容性和权限问题:
try { Intent intent = new Intent(Android.Provider.Settings.ActionApplicationDetailsSettings); Uri uri = Uri.FromParts("package", PackageName, null); intent.SetData(uri); StartActivity(intent); } catch (Exception ex) { // 跳转失败时,可提示用户手动打开系统设置 }
3. 适配华为不同版本私有页面(可选)
若必须跳转华为自启动管理页面,需针对不同系统版本适配组件路径,同时保留通用跳转作为降级方案:
- 部分华为机型可尝试使用组件路径:
com.huawei.systemmanager/.startupmgr.ui.StartupNormalAppListActivity - 即使添加权限,仍需捕获异常并切换到通用跳转逻辑
说明
华为私有组件的权限限制会随系统版本调整,使用系统标准API是最稳定的实现方式,无需依赖厂商私有接口,也能避免权限申请的额外问题。
内容的提问来源于stack exchange,提问作者Katya Appazova
相关产品推荐
相关产品推荐

