Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/195.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 无法从外部应用程序中找到内容提供商_Android_Android Contentprovider - Fatal编程技术网

Android 无法从外部应用程序中找到内容提供商

Android 无法从外部应用程序中找到内容提供商,android,android-contentprovider,Android,Android Contentprovider,我想实现一个可以在两个应用程序之间传输数据的服务。我实现了一个导出的ContentProvider,当我在内部调用它时,它可以正常工作,但当我试图从外部应用程序使用它时,它会给出“找不到…”的提供程序 舱单: <?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android"

我想实现一个可以在两个应用程序之间传输数据的服务。我实现了一个导出的ContentProvider,当我在内部调用它时,它可以正常工作,但当我试图从外部应用程序使用它时,它会给出“找不到…”的提供程序

舱单:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.poc.transferprovider">

    <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/Theme.TransferProvider">
        <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:authorities="com.example.poc.transferprovider"
            android:name="com.example.poc.transferprovider.Provider"
            android:exported="true"
            />
    </application>

</manifest>

供应商:

package com.example.poc.transferprovider

import android.content.ContentProvider
import android.content.ContentValues
import android.database.Cursor
import android.database.MatrixCursor
import android.net.Uri

class Provider: ContentProvider() {

    override fun onCreate(): Boolean = true

    override fun query(
        uri: Uri,
        projection: Array<out String>?,
        selection: String?,
        selectionArgs: Array<out String>?,
        sortOrger: String?
    ): Cursor {
        val cursor = MatrixCursor(arrayOf("column1", "column2"))
        cursor.addRow(arrayOf("value1", "value2"))
        return cursor
    }

    override fun getType(p0: Uri): String? = null

    override fun insert(p0: Uri, p1: ContentValues?): Uri? = null

    override fun delete(p0: Uri, p1: String?, p2: Array<out String>?): Int = 0

    override fun update(p0: Uri, p1: ContentValues?, p2: String?, p3: Array<out String>?): Int = 0
}
package com.example.poc.transferprovider
导入android.content.ContentProvider
导入android.content.ContentValues
导入android.database.Cursor
导入android.database.MatrixCursor
导入android.net.Uri
类提供程序:ContentProvider(){
override fun onCreate():Boolean=true
覆盖有趣的查询(
uri:uri,
投影:数组?,
选择:字符串?,
SelectionAgs:数组?,
分拣员:绳子?
):光标{
val cursor=MatrixCursor(数组(“列1”、“列2”))
cursor.addRow(arrayOf(“value1”、“value2”))
返回光标
}
重写类型(p0:Uri):字符串?=null
覆盖有趣的插入(p0:Uri,p1:ContentValues?:Uri?=null)
覆盖有趣的删除(p0:Uri,p1:String?,p2:Array?):Int=0
覆盖有趣的更新(p0:Uri,p1:ContentValues?,p2:String?,p3:Array?):Int=0
}
这就是调用它的方式:

class MainActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        findViewById<Button>(R.id.button).setOnClickListener {
            val cursor = contentResolver.query(Uri.parse(
                    "content://com.example.poc.transferprovider/Provider"),
                    null,
                    null,
                    null,
                    null)

            if (cursor == null) {
                Log.d("xxx","cursor is null")
                return@setOnClickListener
            }

            while (cursor.moveToNext()) {
                Log.d("xxx", "result ${cursor.getColumnIndex("column1")} ${cursor.getColumnIndex("column2")}")
            }
            cursor.close()
            Toast.makeText(this, "transfer done", Toast.LENGTH_SHORT).show()
        }
    }
}
class MainActivity:AppCompatActivity(){
重写创建时的乐趣(savedInstanceState:Bundle?){
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
findViewById(R.id.button).setOnClickListener{
val cursor=contentResolver.query(Uri.parse(
"content://com.example.poc.transferprovider/Provider"),
无效的
无效的
无效的
空)
if(游标==null){
Log.d(“xxx”,“游标为空”)
return@setOnClickListener
}
while(cursor.moveToNext()){
Log.d(“xxx”,“结果${cursor.getColumnIndex(“column1”)}${cursor.getColumnIndex(“column2”)}”)
}
cursor.close()
Toast.makeText(这是“传输完成”,Toast.LENGTH\u SHORT.show())
}
}
}

android:name=“com.example.poc.transferprovider.Provider”
应该是android:name=“.Provider”或android:name=“com.example.poc.Provider”
类提供者:
不要这样命名。太笼统了。在我看来,
类传输提供商:
更适合你的应用程序。在安卓11设备上?看看包的可见性。是的,我忘记了默认情况下在新项目中使用targetSdk 30,谢谢您指出!请随意将此作为答案发布,我会接受。
android:name=“com.example.poc.transferprovider.Provider”
应该是android:name=“.Provider”或android:name=“com.example.poc.Provider”
类提供者:
不要这样命名。太笼统了。在我看来,
类传输提供商:
更适合你的应用程序。在安卓11设备上?看看包的可见性。是的,我忘记了默认情况下在新项目中使用targetSdk 30,谢谢您指出!请随意将此作为答案发布,我会接受的。