RequestPermissionsAsync 永远不会返回

Posted

技术标签:

【中文标题】RequestPermissionsAsync 永远不会返回【英文标题】:RequestPermissionsAsync never returns 【发布时间】:2019-11-15 12:19:00 【问题描述】:

我正在使用 Xamarin Forms 的权限插件。 当我调用 RequestPermissionsAsync 时,调用似乎永远卡住了。永远不会调用下一行。 我正在按照文档进行正确的设置。 那是我的代码

var 结果 = await CrossPermissions.Current.RequestPermissionsAsync(Permission.Location, Permission.Camera, Permission.Microphone, Permission.Storage);

Console.WriteLine(result) //这条线永远不会被调用

下面是清单

<uses-sdk android:minSdkVersion="21" android:targetSdkVersion="28" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_LOCATION_EXTRA_COMMANDS" />
<uses-permission android:name="android.permission.ACCESS_MOCK_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.CAMERA" />
<uses-permission android:name="android.permission.RECORD_AUDIO" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="com.google.android.providers.gsf.permission.READ_GSERVICES" />
<uses-permission android:name="com.commonground.streetdeploy.permission.MAPS_RECEIVE" />
<uses-permission android:name="android.permission.VIBRATE" />
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
<uses-permission android:name="android.permission.BATTERY_STATS" />
<uses-feature android:name="android.hardware.location" android:required="false" />
<uses-feature android:name="android.hardware.location.gps" android:required="false" />
<uses-feature android:name="android.hardware.location.network" android:required="false" />

<application android:label="Street Deploy" android:allowBackup="false" android:icon="@mipmap/icon">

    <provider android:name="android.support.v4.content.FileProvider" 
          android:authorities="com.commonground.streetdeploy.fileprovider" 
          android:exported="false" android:grantUriPermissions="true">
        <meta-data android:name="android.support.FILE_PROVIDER_PATHS"
             android:resource="@xml/file_paths"></meta-data>
    </provider>
     <!--<meta-data android:name="com.google.android.geo.API_KEY" android:value="xxx" />
         <meta-data android:name="com.google.android.maps.v2.API_KEY" android:value="xxx" />
     <meta-data android:name="com.google.android.maps.v2.API_KEY" android:value="xxx" /> 
     <meta-data android:name="com.google.android.geo.API_KEY" android:value="xxx" />--> 
</application>

这是主要的活动

[活动(标签 = “街道部署”,图标 = “@mipmap/icon”,主题 = “@style/MainTheme”,MainLauncher = true,ConfigurationChanges = ConfigChanges.ScreenSize | ConfigChanges.Orientation)] 公共类 MainActivity : global::Xamarin.Forms.Platform.Android.FormsAppCompatActivity protected async override void OnCreate(Bundle savedInstanceState) TabLayoutResource = Resource.Layout.Tabbar; ToolbarResource = Resource.Layout.Toolbar;

        base.OnCreate(savedInstanceState);


        /////////////////////////my code 





        await Plugin.Media.CrossMedia.Current.Initialize();




        Xamarin.FormsGoogleMaps.Init(this, savedInstanceState);

        UserDialogs.Init(this);

        Xamarin.Essentials.Platform.Init(this, savedInstanceState);



        /////////////////////////end my code 

        global::Xamarin.Forms.Forms.Init(this, savedInstanceState);

Plugin.CurrentActivity.CrossCurrentActivity.Current.Init(this, savedInstanceState);

      LoadApplication(new App());


    
    public override void OnRequestPermissionsResult(int requestCode, string[] permissions, [GeneratedEnum] Android.Content.PM.Permission[] grantResults)
    
        Xamarin.Essentials.Platform.OnRequestPermissionsResult(requestCode, permissions, grantResults);

        base.OnRequestPermissionsResult(requestCode, permissions, grantResults);
    

【问题讨论】:

【参考方案1】:

确保您已在特定平台添加用户权限。

ios 中 (info.plist)

<key>NSAppleMusicUsageDescription</key>
<string>App want to access your Music </string>    
<key>NSCameraUsageDescription</key>
<string>App want to access your Camera</string>
<key>NSMicrophoneUsageDescription</key>
<string>App want to access your Microphone</string>  
<key>NSPhotoLibraryUsageDescription</key>
<string>App want to access your PhotoLibrary</string>    

在 Android 中(Manifest.xml)

<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.CALL_PHONE" />
<uses-permission android:name="android.permission.CAMERA" />

还有那行

Console.WriteLine(result);

当您同意或拒绝申请时将被调用。

【讨论】:

所有这些都已经到位,我在问,因为我花了几个小时试图找出问题所在。 没有没有,一切都是正确的,但它不起作用。调用永远不会返回。 它过去在 Vs 2017 中可以正常工作,现在在 2019 年它不能正常工作,即使使用较旧的模拟器也是如此。我正在使用 Xamarin Forms 4.0 删除项目中的 bin 和 obj 文件夹。然后清理并重建它。 它在我的项目中运行良好(在 VS 2019 中)。所以你能分享一个包含问题的样本,以便我可以测试。

以上是关于RequestPermissionsAsync 永远不会返回的主要内容,如果未能解决你的问题,请参考以下文章

台湾永进GT-200B维修

佛祖保佑永无BUG

明月永在openwrt 忘记root密码

沃通SSL精灵,让站点HTTPS永只是期

顾家集团签约永洪科技,数字化助推制造企业创新与转型升级

顾家集团签约永洪科技,数字化助推制造企业创新与转型升级