You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 16:45:52