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

Xamarin Android中无法重写onRequestPermissionResult问题咨询

解决Xamarin相机权限与OnRequestPermissionsResult重写问题

嘿,作为Xamarin新手碰到这种权限报错确实挺闹心的,我来帮你把这个问题掰扯清楚!

你遇到的核心问题其实是混淆了安卓原生Java语法和Xamarin C#的语法差异,咱们一步步来解决:

为什么会出现@Override不存在或者重写报错?

安卓官方文档是给Java开发者看的,而Xamarin用的是C#,两者的方法重写规则不一样:

  • Java里用@Override注解标记要重写的方法,但C#里不需要这个注解,直接用override关键字就行。
  • 更关键的是:C#的方法名是PascalCase(首字母大写),而Java是小驼峰式,所以原生的onRequestPermissionResult在Xamarin里必须写成OnRequestPermissionsResult(注意首字母O和P都是大写)。你之前写小写开头的方法名,编译器找不到基类里对应的方法,自然会报错。

正确的解决步骤

1. 先在AndroidManifest.xml里声明相机权限

别忘先在清单文件里加权限,不然运行时请求也白搭:

<uses-permission android:name="android.permission.CAMERA" />
<!-- 可选:如果你的应用不是必须依赖相机,可以把required设为false -->
<uses-feature android:name="android.hardware.camera" android:required="false" />
<uses-feature android:name="android.hardware.camera.autofocus" android:required="false" />

2. 正确重写OnRequestPermissionsResult方法

在你的Activity或者Fragment里,按照C#的语法重写这个方法:

using Android.Content.PM;
using AndroidX.Core.App; // 如果你用的是AndroidX,老项目可能用Android.Support.V4.App

public override void OnRequestPermissionsResult(int requestCode, string[] permissions, Permission[] grantResults)
{
    base.OnRequestPermissionsResult(requestCode, permissions, grantResults);
    
    // 定义我们请求相机权限的请求码,要和后面请求权限时的码一致
    const int CameraPermissionRequestCode = 100;
    
    if (requestCode == CameraPermissionRequestCode)
    {
        // 检查权限是否被授予
        if (grantResults.Length > 0 && grantResults[0] == Permission.Granted)
        {
            // 权限通过,这里写打开相机的逻辑
            OpenCamera();
        }
        else
        {
            // 权限被拒绝,给用户提示或者做降级处理
            Toast.MakeText(this, "需要相机权限才能使用该功能哦", ToastLength.Short).Show();
        }
    }
}

3. 运行时请求相机权限的正确写法

在你要打开相机的逻辑前,先检查权限状态,没有权限就发起请求:

const int CameraPermissionRequestCode = 100;

// 检查是否已经拥有相机权限
if (ContextCompat.CheckSelfPermission(this, Manifest.Permission.Camera) != Permission.Granted)
{
    // 发起权限请求
    ActivityCompat.RequestPermissions(this, new string[] { Manifest.Permission.Camera }, CameraPermissionRequestCode);
}
else
{
    // 已经有权限,直接打开相机
    OpenCamera();
}

额外注意点

  • 如果你用的是Fragment,请求权限时直接调用RequestPermissions方法(不需要ActivityCompat),重写OnRequestPermissionsResult的逻辑和Activity里一致。
  • 确保你的项目引用了AndroidX或者Support库的相关包,不然ContextCompat这些类会找不到。
  • 尽量用真实设备测试,模拟器的相机权限有时候会有奇怪的问题。

内容的提问来源于stack exchange,提问作者Raúl Cuadrado

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 08:03:22