问题描述
我正在使用内容提供程序,目前正在编写2个应用程序,假设A和B。应用程序A有一个内容提供程序,并且我试图在应用程序B中使用该提供程序。但是,我无法实现。
应用A:
AndroidManifest.xml
...
<permission android:name="com.myapp.provider.PERMISSION" />
...
<application
...
<provider
android:name=".provider.MyContentProvider"
android:authorities="com.myapp.provider"
android:exported="true"
android:permission="com.myapp.provider.PERMISSION">
</provider>
...
</application>
MyContentProvider.kt
class MyContentProvider : ContentProvider() {
companion object {
const val AUTHORITY = "com.myapp.provider"
const val TABLE = "test"
private const val URL = "content://$AUTHORITY/$TABLE"
val CONTENT_URI = Uri.parse(URL)
const val ID = "_id"
const val USERNAME = "username"
}
override fun onCreate(): Boolean = true
override fun query(
uri: Uri,projection: Array<out String>?,selection: String?,selectionArgs: Array<out String>?,sortOrder: String?
): Cursor? = MatrixCursor(arrayOf(ID,USERNAME),1).apply {
addRow(arrayOf(1,"test"))
}
override fun getType(uri: Uri): String? = "vnd.android.cursor.item/$AUTHORITY.$TABLE"
override fun insert(uri: Uri,values: ContentValues?): Uri? = null
override fun delete(uri: Uri,selectionArgs: Array<out String>?): Int = -1
override fun update(
uri: Uri,values: ContentValues?,selectionArgs: Array<out String>?
): Int = -1
}
应用B:
AndroidManifest.xml
...
<uses-permission android:name = "com.myapp.provider.PERMISSION"/>
...
MainActivity.kt
class MainActivity : AppCompatActivity() {
private val TAG = MainActivity::class.java.simpleName
override fun onCreate(savedInstanceState: Bundle?) {
...
val url = "content://com.myapp.provider/test"
val cursor = this.contentResolver.query(Uri.parse(url),arrayOf("_id","username"),"1=1",null,null)
Log.d(TAG,"Count: ${cursor?.count}")
Log.d(TAG,"ColumnCount: ${cursor?.columnCount}")
if(cursor?.movetoFirst() == true) {
val username: String? = cursor.getString(cursor.getColumnIndex("username"))
cursor.close()
if(username.isNullOrBlank()) {
Log.d(TAG,"username not found")
} else {
Log.d(TAG,"username found: $username")
}
} else {
cursor?.close()
Log.d(TAG,"Cursor is null")
}
}
}
我还为App A编写了一个使用该提供程序的测试,并且该测试已通过。我猜问题出在导出提供程序上,但是我找不到解决这种情况的方法。
应用A:
MyContentProviderTest.kt
class MyContentProviderTest: ProviderTestCase2<MyContentProvider>(
MyContentProvider::class.java,MyContentProvider.AUTHORITY) {
private val TAG = MyContentProviderTest::class.java.simpleName
lateinit var resolver: MockContentResolver
override fun setUp() {
super.setUp()
resolver = mockContentResolver
}
fun testCase() {
val cursor = resolver.query(MyContentProvider.CONTENT_URI,null)
Assert.assertEquals(cursor?.count,1)
Assert.assertEquals(cursor?.columnCount,2)
cursor?.movetoFirst()
Assert.assertEquals(cursor?.getString(cursor.getColumnIndex(MyContentProvider.USERNAME)),"test")
}
}
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)