Xamarin表单文件提供程序未设置

Dun*_*mer 11 c# android android-fileprovider xamarin.forms

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

实施如下:

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;
    }
}
Run Code Online (Sandbox Code Playgroud)

但是,在执行'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>
Run Code Online (Sandbox Code Playgroud)

我的想法是,我需要在这里声明一些内容,但是我无法找到什么,而且我所遵循的所有教程都没有通过设置文件提供程序来完成任何事情.

有什么建议?

小智 14

自述文件说:

如果您的应用程序针对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>
Run Code Online (Sandbox Code Playgroud)

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

2.)将一个名为xml的新文件夹添加到Resources文件夹中,并添加一个名为的新XML文件 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>
Run Code Online (Sandbox Code Playgroud)

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

您可以在以下网址阅读更多信息:https://developer.android.com/training/camera/photobasics.html

  • @JonathanPeel我们也可以使用android:authorities =“ $ {applicationId} .fileprovider”代替android:authorities =“ YOUR_APP_PACKAGE_NAME.fileprovider” (2认同)

Noo*_*001 7

就我而言,这是因为我将FileProvider放在了AndroidManifest.xml文件中的错误位置。它必须位于<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>
Run Code Online (Sandbox Code Playgroud)


hal*_*ldo 5

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

在下面的线上

<provider android:name="android.support.v4.content.FileProvider"
          android:authorities="com.myexample.myapp.fileProvider"
          android:exported="false"
          android:grantUriPermissions="true">
Run Code Online (Sandbox Code Playgroud)

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

android:authorities="com.myexample.myapp.fileprovider"  <!-- all lowercase -->
Run Code Online (Sandbox Code Playgroud)

或者

android:authorities="${applicationId}.fileprovider"    
Run Code Online (Sandbox Code Playgroud)

包名称和值android:authorities应为小写。否则你会得到错误:

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


Osc*_*ers 5

确保你只有一组 <application> 标签

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

像这样定义一次: <application android:label="App2.Android"></application>

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