Android ContentProvider共享文件

  1. 在App A中创建一个文件abc.txt,并写入 测试文本

        private fun saveText() {
            var fos = FileOutputStream(filesDir.path+"/abc.txt")
            var text = "cc"
            fos.write(text.toByteArray())
            fos.flush()
            fos.close()
        }

    上面代码文件存储在/data/user/0/com.example.myapplication/files下,根据需要可自行修改

  2. 自定义一个ContentProvider,并重写openFile方法,注意和openAssetFile方法区分,二者可根据需要选择

    class ContentProviderDemo : ContentProvider() {
        override fun openFile(uri: Uri, mode: String): ParcelFileDescriptor? {
            var path = context?.filesDir?.path
            var file = File(path, uri.path?.substring(1))
            return ParcelFileDescriptor.open(file, ParcelFileDescriptor.MODE_READ_ONLY)
        }
    
        override fun onCreate(): Boolean {
            return false
        }
    
        override fun query(
            uri: Uri,
            projection: Array<out String>?,
            selection: String?,
            selectionArgs: Array<out String>?,
            sortOrder: String?
        ): Cursor? {
            return null
        }
    
        override fun getType(uri: Uri): String? {
            return null
        }
    
        override fun insert(uri: Uri, values: ContentValues?): Uri? {
            return null
        }
    
        override fun delete(uri: Uri, selection: String?, selectionArgs: Array<out String>?): Int {
            return 0
        }
    
        override fun update(
            uri: Uri,
            values: ContentValues?,
            selection: String?,
            selectionArgs: Array<out String>?
        ): Int {
            return 0
        }
    }
  3. 在AndroidManifest.xml文件中注册我们写的ContentProvider

        <!--自定义provider 权限申请-->
        <permission
            android:name="com.hxq.provider.READ"
            android:label="provider pomission"
            android:protectionLevel="normal" />
        <permission
            android:name="com.hxq.provider."
            android:label="provider pomission"
            android:protectionLevel="normal" />
    
         <!--自定义provider 权限申请-->
    
        <application
            -------------
            <provider
                android:name=".provider.ContentProviderDemo"
                android:authorities="testProviderDemo"
                android:exported="true"
                android:permission="com.hxq.provider"
                android:readPermission="com.hxq.provider.READ"
                android:writePermission="com.hxq.provider.WRITE" />
        </application>


    注意:
    android:authorities="testProviderDemo"  //用于唯一标识这个 ContentProvider ,外部调用者可以根据这个标识找到它
    android:exported="true" //这个属性用于指示该服务是否能被其他程序应用组件调用或跟他交互
    android:permission="com.hxq.provider"
    android:readPermission="com.hxq.provider.READ"
    android:writePermission="com.hxq.provider.WRITE"

    后面是访问权限,这里读写都写上了,另外还要申请一下自定义的权限,在使用中发现只写 android:permission="com.hxq.provider"是不管用的,单独写readPermission或者writePermission是可以的,当然配合写也是可以的

  4. 这样就可以在App B中访问上面的文件,
    首先申请权限

    <uses-permission android:name="com.hxq.provider.READ" />

    然后直接访问

    var uri=  Uri.parse("content://testProviderDemo/abc.txt")
    Log.i("MainActivity", "onCreate: " + uri.path)
    var inputStream= contentResolver.openInputStream(uri)
    var buffer= BufferedReader(InputStreamReader(inputStream))
    var line =buffer.readLine()
    while (line != null) {
        Log.i("MainActivity", "line: " +line)
        line=buffer.readLine()
    }
    buffer.close()

    打印出日志:

    com.example.myapplication1 I/MainActivity: onCreate: /abc.txt
    com.example.myapplication1 I/MainActivity: line: cc

    完!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

韩~晓强

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值