Xamarin Forms 文件提供程序未设置。

19

我目前正在学习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:无法获取文件位置。这很可能意味着您的Android清单文件中未设置文件提供程序信息。请查看有关如何在项目中设置此信息的文档。

我已经尝试查找解决方法,但没有成功。目前,我的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>

我的感觉是我需要在这里声明一些内容,但是我找不到要声明什么,而且我跟随的所有教程都没有介绍如何设置文件提供程序。

有什么建议吗?

10个回答

23

说明文件中写道:

如果你的应用程序目标是 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.) 在您的资源文件夹中添加一个名为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


1
谢谢。所以我按照教程做了,除了在android:authorities中他们用的是'YOUR_PACKAGE_NAME.provider',我改成了'MY_PACKAGE_NAME.fileprovider',然后就成功了 :) - Duncan Palmer
我对此感到很困难。 我将我的更改为android:authorities="com.Igs.Mobile.TBOSS.fileprovider"。这是你的意思吗?还是应该字面上为MY_PACKAGE_NAME.fileprovider - JonathanPeel
@JonathanPeel 不是字面意思。如果您进入Android清单选项窗口,它将是输入框中的包名称加上“.fileprovider”。 - Duncan Palmer
1
我真的做不对。 我已经仔细阅读了自述文件大约10遍,检查了每一行代码,但我仍然遇到了错误。有什么建议或尝试的方法吗? - JonathanPeel
3
与其使用 android:authorities="YOUR_APP_PACKAGE_NAME.fileprovider",我们也可以使用 android:authorities="${applicationId}.fileprovider"。 - Himen Suthar
显示剩余2条评论

11

出现这种情况是因为我在 AndroidManifest.xml 文件中把 FileProvider 放错了位置。它需要放在 <Application> 标签内部。

    <?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>

6

我遇到的问题与大小写敏感性有关。

在下一行中:

<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"    
< p > android:authorities 的包名和值应该使用小写字母。否则,您将会收到以下错误信息:

< blockquote >

System.ArgumentException:无法获取文件位置。这很可能是因为您的Android清单文件中未设置文件提供程序信息。请检查文档以了解如何在项目中设置此项。


android:authorities="${applicationId}.fileprovider" 对我有用。 - U.P

5

确保只有一个<application>标签集

我曾因此错误卡了几周时间...... 然后我发现我有重复的应用程序标签。

第一次定义如下: <application android:label="App2.Android"></application>

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


1
这就是让我崩溃的原因。感谢您的强调,因为没有任何关于重复的警告或提示。 - Joseph Devlin
相同,默認情況下它應該有一個,雖然它只有一行。不需要自己創建。我會在 GitHub 上發布請求,要求他們在自述文件中澄清這一點。 - pseudoabdul

3

马可的解决方案几乎是正确的。为了使其在我的项目中有效,我不得不进行更改:

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

AndroidManifest.xml文件中。

1
上面的答案已经解决了我的问题。这是我的 AndroidManifest.xml 文件的样子(在 authorities 标签中使用 ${applicationId} 可以帮助,因为有时你并不知道你的应用程序名称确切是什么):
<?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>

1
<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文件夹下面。

enter image description here


0

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>

它必须在应用程序标签下。


0
最新版本中,正确的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" />

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


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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接