系统抛出无法获取文件异常,即使提供了文件路径和权限 [英] System throws Unable to get file exception even file path and permissions are provided

查看:33
本文介绍了系统抛出无法获取文件异常,即使提供了文件路径和权限的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

单击上传按钮"时出现异常<代码>无法获取文件位置.这很可能意味着文件提供程序信息未在您的 Android 清单文件中设置.进一步调查发现我此时收到错误var file = await CrossMedia.Current.TakePhotoAsync(new Plugin.Media.Abstractions.StoreCameraMediaOptions... 有人可以告知这个异常的原因吗?

On click on the 'UploadButton' I am getting an exception Unable to get file location. This most likely means that the file provider information is not set in your Android Manifest file. Further investigation found out that I am receiving error at this point var file = await CrossMedia.Current.TakePhotoAsync(new Plugin.Media.Abstractions.StoreCameraMediaOptions... Can someone please advise about the cause of this exception ?

//注册.xaml内容:

//Register.xaml content:

<Image x:Name="imageToUpload" />
<Button x:Name="uploadButton" Text="Upload Image" Clicked="UploadButton_Clicked"/>  

//AndroidManifest.xml

//AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android" android:versionCode="1" android:versionName="1.0" package="com.companyname.soccerapp">
    <uses-sdk android:minSdkVersion="21" android:targetSdkVersion="27" />
    <application android:label="soccerapp.Android"></application>
  <uses-permission
    android:name="android.permission.READ_EXTERNAL_STORAGE" />
  <uses-permission
     android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
  <provider android:name="android.support.v4.content.FileProvider"
                android:authorities="com.companyname.soccerapp.fileprovider"
                android:exported="false"
                android:grantUriPermissions="true">
    <meta-data android:name="android.support.FILE_PROVIDER_PATHS"
                    android:resource="@xml/file_paths"></meta-data>
  </provider>
</manifest>

//使用 file_paths.xml

<?xml version="1.0" encoding="utf-8"?>
<paths xmlns:android="http://schemas.android.com/apk/res/android">
    <external-files-path name="my_images" path="Pictures" />
    <external-files-path name="my_movies" path="Movies" />
</paths>

//下面用于UploadButton_Clicked"操作的代码:

//Code below for 'UploadButton_Clicked' action:

private async void UploadButton_Clicked(object sender, EventArgs e)
        {

            if (!CrossMedia.Current.IsCameraAvailable || !CrossMedia.Current.IsTakePhotoSupported)
            {
                await DisplayAlert("No Camera", ":( No camera avaialble.", "OK");
                return;
            }
                try
                {
                    var status = await GetPermissions();

                   if(status == true)
                    {
                    var file = await CrossMedia.Current.TakePhotoAsync(new Plugin.Media.Abstractions.StoreCameraMediaOptions
                    {
                        Directory = "Sample",
                        Name = "test.jpg",
                        SaveToAlbum = saveToGallery.IsToggled
                    });

                    if (file == null)
                        return;

                    await DisplayAlert("File Location", (saveToGallery.IsToggled ? file.AlbumPath : file.Path), "OK");

                    imageToUpload.Source = ImageSource.FromStream(() =>
                    {
                        var stream = file.GetStream();
                        file.Dispose();
                        return stream;
                    });
                }
                   else
                   {
                    await DisplayAlert("Permissions Denied", "Unable to take photos.", "OK");

                    //On iOS you may want to send your user to the settings screen.
                    if (Device.RuntimePlatform == Device.iOS)
                        CrossPermissions.Current.OpenAppSettings();

                } 
                }
                catch (Exception ex)
                {
                    Console.WriteLine("Last, exception! " + ex);

                }

        }

//单独创建一个'GetPermissions()'方法来处理所有权限部分:

// Created a 'GetPermissions()' method separatley to handle all permission part:

public static async Task<bool> GetPermissions()
        {
            bool permissionsGranted = true;

            var permissionsStartList = new List<Permission>()
        {
            Permission.Location,
            Permission.LocationAlways,
            Permission.LocationWhenInUse,
            Permission.Storage,
            Permission.Camera
        };

            var permissionsNeededList = new List<Permission>();
            try
            {
                foreach (var permission in permissionsStartList)
                {
                    var status = await CrossPermissions.Current.CheckPermissionStatusAsync(permission);
                    if (status != PermissionStatus.Granted)
                    {
                        permissionsNeededList.Add(permission);
                    }
                }
            }
            catch (Exception ex)
            {
                Console.WriteLine("Nice, exception! " + ex);
            }

            var results = await CrossPermissions.Current.RequestPermissionsAsync(permissionsNeededList.ToArray());

            try
            {
                foreach (var permission in permissionsNeededList)
                {
                    var status = PermissionStatus.Unknown;
                    //Best practice to always check that the key exists
                    if (results.ContainsKey(permission))
                        status = results[permission];
                    if (status == PermissionStatus.Granted || status == PermissionStatus.Unknown)
                    {
                        permissionsGranted = true;
                    }
                    else
                    {
                        permissionsGranted = false;
                        break;
                    }
                }
            }
            catch (Exception ex)
            {
                Console.WriteLine("Last, exception! " + ex);
            }
            return permissionsGranted;
        }

推荐答案

尝试改变

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
  android:versionCode="1" android:versionName="1.0" 
   package="com.companyname.soccerapp">
<uses-sdk android:minSdkVersion="21" android:targetSdkVersion="27" />
<application android:label="soccerapp.Android"></application>
<uses-permission
  android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission
  android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<provider android:name="android.support.v4.content.FileProvider"
            android:authorities="com.companyname.soccerapp.fileprovider"
            android:exported="false"
            android:grantUriPermissions="true">
 <meta-data android:name="android.support.FILE_PROVIDER_PATHS"
                android:resource="@xml/file_paths"></meta-data>
</provider>
</manifest>

到:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
   android:versionCode="1" android:versionName="1.0" package="com.companyname.soccerapp">
   <uses-sdk android:minSdkVersion="21" android:targetSdkVersion="27" />
   <application android:label="soccerapp.Android">

       <provider android:name="android.support.v4.content.FileProvider"
            android:authorities="com.companyname.soccerapp.fileprovider"
            android:exported="false"
            android:grantUriPermissions="true">
       <meta-data android:name="android.support.FILE_PROVIDER_PATHS"
                  android:resource="@xml/file_paths"></meta-data>
       </provider>

    </application>
<uses-permission
  android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission
   android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

</manifest>

这篇关于系统抛出无法获取文件异常,即使提供了文件路径和权限的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆