Android 无法从外部应用程序中找到内容提供商
我想实现一个可以在两个应用程序之间传输数据的服务。我实现了一个导出的ContentProvider,当我在内部调用它时,它可以正常工作,但当我试图从外部应用程序使用它时,它会给出“找不到…”的提供程序 舱单: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"
<?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,谢谢您指出!请随意将此作为答案发布,我会接受的。