无法使用客户端应用程序中的内容提供程序导出数据

问题描述

我正在使用内容提供程序,目前正在编写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 (将#修改为@)

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...