【问题标题】:Xamarin Forms File Provider not set未设置 Xamarin 表单文件提供程序
【发布时间】:2018-01-24 05:58:46
【问题描述】:

我目前正在学习 Xamarin.Forms。我目前正在尝试使用 Plugin.Media.CrossMedia 库实现相机功能。

实现如下:

public async Task<ImageSource> StartCamera()
{
    await CrossMedia.Current.Initialize();


    if (Plugin.Media.CrossMedia.Current.IsTakePhotoSupported && CrossMedia.Current.IsCameraAvailable)
    {
            var photo = await CrossMedia.Current.TakePhotoAsync(new StoreCameraMediaOptions() { SaveToAlbum=false, SaveMetaData=false});

            if (photo != null)
                return ImageSource.FromStream(() => { return photo.GetStream(); });
            else
                return null;



    }
    else
    {
        return null;
    }
}

但是,在执行“TakePhotoAsync”方法时,我收到以下错误。

System.ArgumentException: Unable to get file location. This most likely means that the file provider information is not set in your Android Manifest file. Please check documentation on how to set this up in your project.

我已尝试查找此内容,但无济于事。我的 AndroidManifest.xml 文件现在看起来像这样。

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

我的想法是我需要在这里声明一些东西,但我找不到什么,而且我遵循的所有教程都没有涉及设置文件提供程序的任何内容。

有什么建议吗?

【问题讨论】:

    标签: c# android xamarin.forms android-fileprovider


    【解决方案1】:

    自述文件说:

    如果您的应用程序面向 Android N (API 24) 或更高版本,则必须使用 2.6.0+ 版本。

    您还必须添加一些额外的配置文件以遵守新的严格模式:

    1.) 在标签内的 AndroidManifest.xml 中添加以下内容:

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

    YOUR_APP_PACKAGE_NAME 必须设置为您的应用包名称!

    2.) 在 Resources 文件夹中添加一个名为 xml 的新文件夹,并添加一个名为 file_paths.xml 的新 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>
    

    YOUR_APP_PACKAGE_NAME 必须设置为您的应用包名称!

    您可以阅读更多内容:https://developer.android.com/training/camera/photobasics.html

    【讨论】:

    • 谢谢。因此,我遵循了完全相同的教程,除了在 android:authorities 中他们有“YOUR_PACKAGE_NAME.provider”。更改为“MY_PACKAGE_NAME.fileprovider”,它起作用了:)
    • 我很难接受这个。我把我的改成android:authorities="com.Igs.Mobile.TBOSS.fileprovider"这是你的意思,还是应该是MY_PACKAGE_NAME.fileprovider
    • @JonathanPeel 不是字面意思。如果您进入 Android Manifest Options 窗口,它将是包名称输入框中的内容,并在末尾添加了“.fileprovider”。
    • 我真的没有做对。我已经阅读了大约 10 次自述文件,仔细检查了每一行,但我仍然收到此错误。有什么我可以尝试的想法吗?
    • @JonathanPeel 代替 android:authorities="YOUR_APP_PACKAGE_NAME.fileprovider" ,我们也可以使用 android:authorities="${applicationId}.fileprovider"
    【解决方案2】:

    在我的情况下,这是因为我将 FileProvider 放在了 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.myapp.app1" android:installLocation="auto">
            <uses-sdk android:minSdkVersion="22" android:targetSdkVersion="27" />
            <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_NETWORK_STATE" />
            <uses-permission android:name="android.permission.ACCESS_SURFACE_FLINGER" />
            <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
            <uses-permission android:name="android.permission.BROADCAST_WAP_PUSH" />
            <uses-permission android:name="android.permission.CAMERA" />
            <uses-permission android:name="android.permission.INTERNET" />
            <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
            <uses-permission android:name="android.permission.RECEIVE_WAP_PUSH" />
            <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
            <uses-permission android:name="android.permission.WRITE_SETTINGS" />
            <uses-permission android:name="android.permission.ACCESS_LOCATION_EXTRA_COMMANDS" />
            <uses-permission android:name="android.permission.ACCESS_MOCK_LOCATION" />
            <application android:label="app1.Android">
                <meta-data android:name="com.google.android.maps.v2.API_KEY" android:value="AIzaSyCZF1O9_7-MXlxYfAEIxBQkr-dR8RiwiYE" />
    
                <!-- ADD FILE PROVIDER HERE -->
                <provider android:name="android.support.v4.content.FileProvider"
                      android:authorities="com.myapp.app1.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>
        </manifest>
    

    【讨论】:

      【解决方案3】:

      我遇到的问题与区分大小写有关。

      在下一行

      <provider android:name="android.support.v4.content.FileProvider"
                android:authorities="com.myexample.myapp.fileProvider"
                android:exported="false"
                android:grantUriPermissions="true">
      

      我错误地在android:authorities="com.myexample.myapp.fileProvider" 行上有一个大写字母。应该是:

      android:authorities="com.myexample.myapp.fileprovider"  <!-- all lowercase -->
      

      或者

      android:authorities="${applicationId}.fileprovider"    
      

      android:authorities 的包名称和值应为小写。否则会报错:

      System.ArgumentException:无法获取文件位置。这个最 可能意味着文件提供者信息未在您的 Android 清单文件。请查看有关如何设置的文档 在你的项目中。

      【讨论】:

      • android:authorities="${applicationId}.fileprovider" 为我工作
      【解决方案4】:

      确保您只有一组 标签

      我被这个错误困住了好几个星期……然后我意识到我有重复的应用程序标签。

      像这样定义一次: &lt;application android:label="App2.Android"&gt;&lt;/application&gt;

      第二组 标记具有正确的配置,但被忽略了。删除空标签为我解决了这个问题。

      【讨论】:

      • 这就是杀死我的原因。感谢您强调这一点,因为没有警告或任何关于重复的内容
      • 相同,默认情况下应该有一个,虽然它只有一行。无需自己制作。我会在 github 上发帖,要求他们在自述文件中澄清这一点。
      【解决方案5】:

      Marco 的解决方案几乎是正确的。为了让它在我的项目中工作,我必须改变

      android:authorities="YOUR_APP_PACKAGE_NAME.fileprovider"
      to
      android:authorities="${applicationId}.fileprovider" 
      

      AndroidManifest.xml 文件中。

      【讨论】:

        【解决方案6】:

        以上答案为我解决了这个问题。这是我的 AndroidManifest.xml 的样子(使用 ${applicationId} 作为 authority 标签会有所帮助,因为有时您只是不知道您的应用名称的确切含义):

        <?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.app2">
        
        <uses-sdk android:minSdkVersion="21" android:targetSdkVersion="30" />
        <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
        <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
        
        <application android:label="App2.Android" android:theme="@style/MainTheme">
            <provider android:name="androidx.core.content.FileProvider" 
                  android:authorities="${applicationId}.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>
        
        </manifest>
        

        【讨论】:

          【解决方案7】:

          使用最新版本,正确的 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>
          

          如果您设置路径结合 包名称 如下所示

          <external-path name="my_images" path="Android/data/YOUR_APP_PACKAGE_NAME/files/Pictures" />
          

          可能会出现这种类型的错误。

          【讨论】:

            【解决方案8】:

            Android 支持库现在位于 androidx.* 包层次结构中,而不是 android.support

            所以在应用程序的 manifest.xml 文件中使用以下提供者标签。

            <provider android:name="androidx.core.content.FileProvider" 
                        android:authorities="YOUR_APP_PACKAGE_NAME.fileprovider" 
                        android:exported="false" 
                        android:grantUriPermissions="true">
                        <meta-data android:name="android.support.FILE_PROVIDER_PATHS" 
                        android:resource="@xml/file_paths"></meta-data></provider>
            

            必须在应用标签下。

            【讨论】:

              【解决方案9】:
              <provider android:name="androidx.core.content.FileProvider"
                    android:authorities="APP_PACKAGE_NAME.fileprovider"
                    android:exported="false"
                    android:grantUriPermissions="true">
              
                <meta-data
                       android:name="android.support.FILE_PROVIDER_PATHS"
                       android:resource="@xml/file_paths"></meta-data>
              </provider>
              

              xml必须在xml文件夹下

              【讨论】:

                【解决方案10】:

                除了这些事情之外,我还必须做一件事来消除这个错误。我已手动将 xml 文件夹和 file_paths.xml 添加到项目文件夹中。但是,我还没有将它们添加到解决方案中的项目中。一旦我右键单击资源文件夹并添加新文件夹 (xml) 和现有项目 (file_paths.xml),错误就消失了。

                【讨论】:

                  猜你喜欢
                  • 2019-11-24
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 2012-05-31
                  • 1970-01-01
                  • 2018-11-23
                  • 2019-09-27
                  • 2013-08-23
                  相关资源
                  最近更新 更多