java.lang.nullpoInterException:'尝试调用虚拟方法' void android.app.App.Acp.requestpermissions(java.lang.lang.string [],int)&#x27'

发布于 2025-01-29 15:17:56 字数 1292 浏览 1 评论 0原文

我试图在App的类上请求read_contacts权限,但引发了例外 例外 java.lang.nullpointerexception:“尝试调用虚拟方法” void android.app.activity.requestpermissions(java.lang.string [],int)'null对象引用

{
    public App(SignalrMessenger signalrMessenger, ChatServicesSettings chatServicesSettings, ContactServices contactServices)
    {
        InitializeComponent();
        

        if (!IsPermissioGranted(Android.App.Application.Context, Manifest.Permission.ReadContacts))
        {
            RequestPermission(Android.App.Application.Context as Activity, new[] { Manifest.Permission.ReadContacts }).GetAwaiter().GetResult();
        }

        MauiApplicationServices.WasDatabaseUpdatedOnStartUp = contactServices.SynchronizeDbWithLocalContacts().GetAwaiter().GetResult();

        MainPage = new MainPage(signalrMessenger,chatServicesSettings);//new AppShell();
    }
    public bool IsPermissioGranted(Context ctx, string permission)
    {
        return ActivityCompat.CheckSelfPermission(ctx, permission)== Permission.Granted;
    }
    public async Task RequestPermission(Activity activity, params string[] permissions)
    {
        ActivityCompat.RequestPermissions(activity, permissions, 0);
        await Task.CompletedTask;
    }
}

'要在活动中获得许可并注入服务?由于MainActity应用程序初始化中调用了默认的CTOR

I have tried to request on App's class to request the READ_CONTACTS permissions but throws an exception
Exception
Java.Lang.NullPointerException: 'Attempt to invoke virtual method 'void android.app.Activity.requestPermissions(java.lang.String[], int)' on a null object reference'

{
    public App(SignalrMessenger signalrMessenger, ChatServicesSettings chatServicesSettings, ContactServices contactServices)
    {
        InitializeComponent();
        

        if (!IsPermissioGranted(Android.App.Application.Context, Manifest.Permission.ReadContacts))
        {
            RequestPermission(Android.App.Application.Context as Activity, new[] { Manifest.Permission.ReadContacts }).GetAwaiter().GetResult();
        }

        MauiApplicationServices.WasDatabaseUpdatedOnStartUp = contactServices.SynchronizeDbWithLocalContacts().GetAwaiter().GetResult();

        MainPage = new MainPage(signalrMessenger,chatServicesSettings);//new AppShell();
    }
    public bool IsPermissioGranted(Context ctx, string permission)
    {
        return ActivityCompat.CheckSelfPermission(ctx, permission)== Permission.Granted;
    }
    public async Task RequestPermission(Activity activity, params string[] permissions)
    {
        ActivityCompat.RequestPermissions(activity, permissions, 0);
        await Task.CompletedTask;
    }
}

So I wonder if there is possibly a way to ask for permission in an Activity and inject a service OnCreate method? since the default ctor is called in the MainActity app initialization

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

花辞树 2025-02-05 15:17:56

on Create方法将按预期触发MainActivity类中的预期。

您可以要求在mainActivity中索取权限,而不是app类。

示例代码

protected override void OnCreate(Bundle savedInstanceState)
    {
        base.OnCreate(savedInstanceState);

        if (ContextCompat.CheckSelfPermission(this, Manifest.Permission.Camera) == (int)Permission.Granted)
        {
            // We have permission, go ahead and use the camera.
        }
        else
        {
            ActivityCompat.RequestPermissions(this, new String[] { Manifest.Permission.Camera },0);
        }
    }

public override void OnRequestPermissionsResult(int requestCode, string[] permissions, Permission[] grantResults)
    {
         base.OnRequestPermissionsResult(requestCode, permissions, grantResults);
    }

OnCreate method will be triggered as expected in MainActivity class.

You can ask for the permission inside MainActivity instead of App class.

Sample code

protected override void OnCreate(Bundle savedInstanceState)
    {
        base.OnCreate(savedInstanceState);

        if (ContextCompat.CheckSelfPermission(this, Manifest.Permission.Camera) == (int)Permission.Granted)
        {
            // We have permission, go ahead and use the camera.
        }
        else
        {
            ActivityCompat.RequestPermissions(this, new String[] { Manifest.Permission.Camera },0);
        }
    }

public override void OnRequestPermissionsResult(int requestCode, string[] permissions, Permission[] grantResults)
    {
         base.OnRequestPermissionsResult(requestCode, permissions, grantResults);
    }
街角卖回忆 2025-02-05 15:17:56

您可以将Main Activity作为App Methord

步骤1中的参数传递为参数:初始化App Methord步骤2中的活动变量

     public App(SignalrMessenger signalrMessenger, ChatServicesSettings 
             chatServicesSettings, ContactServices contactServices,Activity activity)

:在App Methord

       public App(SignalrMessenger signalrMessenger, ChatServicesSettingschatServicesSettings, ContactServices contactServices,Activity activity)
{
    InitializeComponent();
    this.activity = activity;
    .........
    ........}

步骤3中创建构造函数:现在,用可缝合参数调用App Methord

    App( signalrMessenger, chatServicesSettings,contactServices,MainActivity.this)

     
    

{
public App(signalrmessenger signalrmessenger,chatservicessettings chatservicessetsings,ContactServices ContactServices)
{
InitializeComponent();

    if (!IsPermissioGranted(Android.App.Application.Context, Manifest.Permission.ReadContacts))
    {
        RequestPermission(Android.App.Application.Context as Activity, new[] { Manifest.Permission.ReadContacts }).GetAwaiter().GetResult();
    }

    MauiApplicationServices.WasDatabaseUpdatedOnStartUp = contactServices.SynchronizeDbWithLocalContacts().GetAwaiter().GetResult();

    MainPage = new MainPage(signalrMessenger,chatServicesSettings);//new AppShell();
}
public bool IsPermissioGranted(Context ctx, string permission)
{
    return ActivityCompat.CheckSelfPermission(ctx, permission)== Permission.Granted;
}
public async Task RequestPermission(Activity activity, params string[] permissions)
{
    ActivityCompat.RequestPermissions(activity, permissions, 0);
    await Task.CompletedTask;
}

}

You can pass MainActivity as argument in App methord

step 1: Initialise a Activity variable in App methord

     public App(SignalrMessenger signalrMessenger, ChatServicesSettings 
             chatServicesSettings, ContactServices contactServices,Activity activity)

Step 2 : Create Constructor with in the App Methord

       public App(SignalrMessenger signalrMessenger, ChatServicesSettingschatServicesSettings, ContactServices contactServices,Activity activity)
{
    InitializeComponent();
    this.activity = activity;
    .........
    ........}

Step 3: Now call App Methord with sutable Parameter

    App( signalrMessenger, chatServicesSettings,contactServices,MainActivity.this)

     
    

{
public App(SignalrMessenger signalrMessenger, ChatServicesSettings chatServicesSettings, ContactServices contactServices)
{
InitializeComponent();

    if (!IsPermissioGranted(Android.App.Application.Context, Manifest.Permission.ReadContacts))
    {
        RequestPermission(Android.App.Application.Context as Activity, new[] { Manifest.Permission.ReadContacts }).GetAwaiter().GetResult();
    }

    MauiApplicationServices.WasDatabaseUpdatedOnStartUp = contactServices.SynchronizeDbWithLocalContacts().GetAwaiter().GetResult();

    MainPage = new MainPage(signalrMessenger,chatServicesSettings);//new AppShell();
}
public bool IsPermissioGranted(Context ctx, string permission)
{
    return ActivityCompat.CheckSelfPermission(ctx, permission)== Permission.Granted;
}
public async Task RequestPermission(Activity activity, params string[] permissions)
{
    ActivityCompat.RequestPermissions(activity, permissions, 0);
    await Task.CompletedTask;
}

}

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文