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

    完!

  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: Android ContentProviderAndroid系统中的一个组件,用于管理应用程序之间的数据共享。它提供了一种标准的接口,使得应用程序可以访问其他应用程序的数据,同时也可以保护数据的安全性。ContentProvider可以将数据存储在文件系统、SQLite数据库或者网络上,然后通过URI来访问这些数据。开发者可以通过继承ContentProvider类来创建自己的ContentProvider,然后在AndroidManifest.xml文件中注册。在使用ContentProvider时,需要使用ContentResolver类来访问数据。 ### 回答2: Android ContentProviderAndroid Framework中的一个重要组件,用于在应用间共享数据。它提供一种标准化的方式,让其它应用或组件访问原本受到封装的私有数据。ContentProvider采用标准的CRUD(Create、Retrieve、Update、Delete)逻辑来管理数据,且提供额外的查询功能,是实现数据在应用间共享的理想选择。 ContentProvider可以用来实现以下几个功能: 1. 数据共享:ContentProvider提供了一个标准的接口,让其它应用或组件来操作内容提供者的数据。 2. 数据访问保护:ContentProvider可以控制其它应用或组件只有在得到授权的情况下才能访问数据。 3. 储存树形数据:储存树形数据是很常见的需求,不像SQLite那样的关系型数据库。 4. 数据访问审计:作为应用中的一个中央存储库,ContentProvider可以记录其它应用或组件对它的操作记录。 下面以一个简单的例子来说明ContentProvider的使用过程: 1. 首先在AndroidManifest.xml文件中定义ContentProvider,必须在所有Activity的前面定义; 2. 在代码中继承ContentProvider,实现CRUD和查询方法; 3. 在应用中使用CursorLoader或ContentResolver访问ContentProvider中的数据; 4. 客户端进程和服务端进程都需要读写ContentProvider,为了防止多线程数据访问问题, ContentProvider通常会使用线程池来进行并发处理。 ContentProviderAndroid组件中的一种,应用程序可以通过该组件来暴露自己的数据给其它应用程序使用,同时也可以访问其它应用程序的ContentProvider,以获取到这些应用程序所提供的数据。ContentProvider的实例在Android开发中广泛运用。通过ContentProvider,我们可以更加方便地共享数据,能够让我们的应用程序变得更加灵活。 ### 回答3: Android提供了Content Provider框架,以便不同的应用程序之间共享数据。ContentProvider提供了一种安全访问数据的方式,防止数据被未经授权的访问。 实现Content Provider需要定义一个类,该类继承自ContentProvider类,并实现一些必要的方法,包括onCreate()、query()、insert()、update()和delete()。我们可以通过Content Resolver类来访问Content Provider,它是一个用于查询、插入、更新和删除数据的类。 Content Provider的最大好处是在应用程序之间共享数据。例如,一个应用程序可以提供联系人列表,并允许其他应用程序访问该列表。如果应用程序需要共享数据,可以使用Content Provider。 在实现Content Provider时,需要确定好URI的结构,以便其他应用程序访问数据。URI的结构可以根据应用程序的需求来定制。例如,我想创建一个共享书籍列表的Content Provider,URI可以定义为content://com.example.bookprovider/books。通过这个URI,其他应用程序可以访问该Provider中的books表,并操作数据。 要使用Content Provider,需要先在AndroidManifest.xml文件中注册该Provider。这需要声明一个<provider>标记,其中包含Provider的名称、权限和URI。 Content ProviderAndroid中被广泛使用,它可以让应用程序之间共享数据,并提高应用程序的安全性。但是,使用Content Provider也需要注意数据安全性,防止数据被未经授权的访问。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

韩~晓强

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

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

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

打赏作者

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

抵扣说明:

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

余额充值