java - "Couldn' t 查找具有权限 com.google.firebase.database.provider 的提供商的元数据”

标签 java android firebase-realtime-database

我正在尝试开发一个利用 Firebase 并从中上传和检索照片 + 文本名称的应用程序。

我在尝试拍照时收到该错误,该应用程序使用 native 手机的相机。

我的 Manifest.xml 文件当前如下所示:

<?xml version="1.0" encoding="utf-8"?>

<uses-permission android:name="android.permission.INTERNET" />

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


<uses-feature
    android:name="android.hardware.Camera"
    android:required="true" />


<application
    android:allowBackup="true"
    android:icon="@mipmap/ic_launcher"
    android:label="@string/app_name"
    android:roundIcon="@mipmap/ic_launcher_round"
    android:supportsRtl="true"
    android:theme="@style/AppTheme">
    <activity android:name=".EditImage"></activity>
    <activity android:name=".ImageActivity" />
    <activity android:name=".display_image" />
    <activity android:name=".MainActivity">
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />

            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>

    <provider
    android:name="androidx.core.content.FileProvider"
    android:authorities="${applicationId}.provider"
    android:exported="false"
    android:grantUriPermissions="true">
    <meta-data
        android:name="android.support.FILE_PROVIDER_PATHS"
        android:resource="@xml/provider_paths" />
</provider>
</application>

provider_path 像这样:

<?xml version="1.0" encoding="utf-8"?>
<paths xmlns:android="http://schemas.android.com/apk/res/android">
    <external-path
        name="external"
        path="." />
    <external-files-path
        name="external_files"
        path="." />
    <cache-path
        name="cache"
        path="." />
    <external-cache-path
        name="external_cache"
        path="." />
    <files-path
        name="files"
        path="." />
</paths>

我的拍照代码如下所示:

 public void captureImage(View view) {

        Intent cameraIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);

        if(cameraIntent.resolveActivity(getPackageManager())!=null){
            File imageFile = null;

            try {
                imageFile = getImageFile();
            } catch (IOException e) {
                e.printStackTrace();
            }

            if(imageFile!=null){

                Uri imageUri = FileProvider.getUriForFile(Objects.requireNonNull(getApplicationContext()),
                        BuildConfig.APPLICATION_ID + ".provider", imageFile);
                cameraIntent.putExtra(MediaStore.EXTRA_OUTPUT,imageUri);

                startActivityForResult(cameraIntent, IMAGE_REQUEST);
            }
        }

    }

这是“getImageFile()”函数

private File getImageFile()throws IOException {

        String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss").format(new Date());
        String imageName = "jpg_"+timeStamp+"_";
        File storageDir = getExternalFilesDir(Environment.DIRECTORY_DCIM);

        File imageFile = File.createTempFile(imageName, ".jpg", storageDir);

        currentImagePath = imageFile.getAbsolutePath();
        return imageFile;

    }

这里的问题是,当单击调用“captureImage()”的按钮时,我会遇到以下问题:

E/AndroidRuntime: FATAL EXCEPTION: main
    Process: com.camera.camerapsi, PID: 26813
    java.lang.IllegalStateException: Could not execute method for android:onClick
        at androidx.appcompat.app.AppCompatViewInflater$DeclaredOnClickListener.onClick(AppCompatViewInflater.java:402)
        at android.view.View.performClick(View.java:7201)
        at android.view.View.performClickInternal(View.java:7170)
        at android.view.View.access$3500(View.java:806)
        at android.view.View$PerformClick.run(View.java:27582)
        at android.os.Handler.handleCallback(Handler.java:883)
        at android.os.Handler.dispatchMessage(Handler.java:100)
        at android.os.Looper.loop(Looper.java:214)
        at android.app.ActivityThread.main(ActivityThread.java:7710)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:516)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:950)
     Caused by: java.lang.reflect.InvocationTargetException
        at java.lang.reflect.Method.invoke(Native Method)
        at androidx.appcompat.app.AppCompatViewInflater$DeclaredOnClickListener.onClick(AppCompatViewInflater.java:397)
        at android.view.View.performClick(View.java:7201) 
        at android.view.View.performClickInternal(View.java:7170) 
        at android.view.View.access$3500(View.java:806) 
        at android.view.View$PerformClick.run(View.java:27582) 
        at android.os.Handler.handleCallback(Handler.java:883) 
        at android.os.Handler.dispatchMessage(Handler.java:100) 
        at android.os.Looper.loop(Looper.java:214) 
        at android.app.ActivityThread.main(ActivityThread.java:7710) 
        at java.lang.reflect.Method.invoke(Native Method) 
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:516) 
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:950) 
     Caused by: java.lang.IllegalArgumentException: Couldn't find meta-data for provider with authority com.google.firebase.database.provider
        at androidx.core.content.FileProvider.parsePathStrategy(FileProvider.java:606)
        at androidx.core.content.FileProvider.getPathStrategy(FileProvider.java:579)
        at androidx.core.content.FileProvider.getUriForFile(FileProvider.java:417)
        at com.camera.camerapsi.MainActivity.captureImage(MainActivity.java:198)
        at java.lang.reflect.Method.invoke(Native Method) 
        at androidx.appcompat.app.AppCompatViewInflater$DeclaredOnClickListener.onClick(AppCompatViewInflater.java:397) 
        at android.view.View.performClick(View.java:7201) 
        at android.view.View.performClickInternal(View.java:7170) 
        at android.view.View.access$3500(View.java:806) 
        at android.view.View$PerformClick.run(View.java:27582) 
        at android.os.Handler.handleCallback(Handler.java:883) 
        at android.os.Handler.dispatchMessage(Handler.java:100) 
        at android.os.Looper.loop(Looper.java:214) 
        at android.app.ActivityThread.main(ActivityThread.java:7710) 
        at java.lang.reflect.Method.invoke(Native Method) 
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:516) 
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:950) 

我不知道为什么我的代码不起作用,任何帮助将不胜感激!

最佳答案

问题非常具体,以下行 BuildConfig.APPLICATION_ID + ".provider", imageFile); 就是问题所在。在本例中,“BuildConfig.APPLICATION_ID”获取 Firebase 的 ID,而不是应用程序本身的 ID。

修复如下:"com.yourpackagehere.yourpackage"+ ".provider", imageFile); 由于 Android Studio 可能与 Firebase 中的库发生冲突,因此无法使用自己的BuildConfig

希望这对将来遇到像我这样问题的人有帮助!

关于java - "Couldn' t 查找具有权限 com.google.firebase.database.provider 的提供商的元数据”,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62291716/

相关文章:

ios - 数组元素连续追加

swift 火力基地 : can't create keys with same order exception

java - Java 和 C# 应用程序之间的套接字通信

android - adjustResize 向上推 EditText 但不向上推 RecyclerView

Android studio 如何从github源构建项目

Android ActionBar (ActionBarCompat) Spinner 下拉列表 ?

android - 由于 Firebase 规则不是过滤器,那么我们如何过滤呢?

java - 定向数据库:向属性添加属性

java - 从用户 Java 输入中获取首字母

java - java中的Mongo聚合