目的としてはアプリAとアプリBでJsonのやり取りをしたいです
コンテンツプロバイダを使ってアプリAの持っているローカルのファイルをアプリBで呼び出したいと考えています。
アプリA内ではdata/data...にファイルを保存して、クリックでアプリBに遷移するようにしています。
ファイルが指定の場所の保存できていることが確認できたのでここは問題ないと思います。
アプリBのコードはこのようになっています。
cursorが取得できないため失敗のログが出力されます
log
1D/LOG: 処理開始 2E/ActivityThread: Failed to find provider info for アプリ名 3D/LOG: 処理終了
Kotlin
1class MainActivity : AppCompatActivity() { 2 3 override fun onCreate(savedInstanceState: Bundle?) { 4 super.onCreate(savedInstanceState) 5 setContentView(R.layout.activity_main) 6 Log.d("LOG", "処理開始") 7 // val resolver = contentResolver 8 val uri: Uri? = Uri.parse("content://hogehoge.testApp/get/work_json") 9 uri?.let{uri -> 10 val cursor = this.contentResolver.query(uri, null, null, null, null) 11 cursor?.let { cursor -> 12 cursor.moveToFirst(); 13 var path = cursor.getString(cursor.getColumnIndex("value")) 14 cursor.close() 15 Log.d("LOG", path) 16 17 } 18 } 19 Log.d("LOG", "処理終了") 20 } 21}
xmlのパーミッションも設定済みです
xml
1 2 <uses-permission android:name="test.permission" />
アプリAのコンテンツプロバイダクラスはこのようになっています。
実装しているのはqueryの部分だけで、ローカルのファイルパスを取得してカーソルにセットして返しています。
Kotlin
1class WorkerContentProvider: ContentProvider() { 2 override fun getType(uri: Uri): String? { 3 TODO("not implemented") //To change body of created functions use File | Settings | File Templates. 4 } 5 6 override fun delete(uri: Uri, selection: String?, selectionArgs: Array<String>?): Int { 7 TODO("not implemented") //To change body of created functions use File | Settings | File Templates. 8 } 9 10 override fun update(uri: Uri, values: ContentValues?, selection: String?, selectionArgs: Array<String>?): Int { 11 TODO("not implemented") //To change body of created functions use File | Settings | File Templates. 12 } 13 14 override fun onCreate(): Boolean { 15 return false 16 } 17 override fun query(uri: Uri, projection: Array<String>?, selection: String?, selectionArgs: Array<String>?, sortOrder: String?): Cursor? { 18 val uri = Uri.parse(LocalFileData.path) 19 20 var file = File(LocalFileData.path) 21 22 val FROM:Array<String> = arrayOf("value") 23 val cursor:MatrixCursor = MatrixCursor(FROM) 24 val obj:Array<Any> = Any() as Array<Any> 25 obj[0] = file.toString() 26 27 cursor.addRow(obj) 28 return cursor 29 30 } 31 32 override fun insert(uri: Uri, values: ContentValues?): Uri? { 33 TODO("not implemented") //To change body of created functions use File | Settings | File Templates. 34 } 35}
xml
1<uses-permission android:name="test.permission" /> 2 3<provider android:name=".WorkerContentProvider" android:authorities="com.test.contentprovider.myapp" android:enabled="true" android:exported="true" android:permission="test.permission" /> 4
コンテンツプロバイダの概念が難しくてよく理解てできていない状況で無理やり組んだのでどこがダメなのか全然わからずはまってしまっています。
あなたの回答
tips
プレビュー