【android路径写法以及存储】

这篇博客探讨了如何在Android中保存数据到手机ROM和SD卡,包括使用`openFileOutput`创建文件、设置文件权限如`MODE_PRIVATE`、`MODE_WORLD_READABLE|MODE_WORLD_WRITEABLE`,以及`SharedPreferences`的读写操作。同时,提到了Linux文件访问权限的概念,并强调了在Android中每个应用的文件访问权限是由用户组控制的。
———————————————路径的写法:———————————————

一般都是绝对路径、相对路径、提供的API

———jsp各类路径的写法:————————

request.getRequestDispatcher("/index.jsp").forward(request, response); 
请求转发中的/代表web应用
response.sendRedirect("/HelloJavaweb/index.jsp");  
请求重定向中的/代表网站

———android中的路径写法:———————

前面这个/代表手机根目录
/data/data/cn.itcast.datasave/files/config.txt
/mnt/sdcard

—————————————————————————————————————————————————————————


—————————————————往手机rom中保存数据————————
存放手机rom内存里面:

通过context的openfileoutput("config.txt ",Context.MODE_WORLD_WRITEABLE|Context.MODE_WORLD_READABLE) 
创建的文件:
data/data/<包名>/files/config.txt 

——————————设置权限:

如果我们应用在当前包下创建了一个文件,并且我们希望别的应用程序 可以访问我们的文件 
一定要指定文件的权限  Context.MODE_WORLD_READABLE|Context.MODE_WORLD_WRITEABLE

如果我们不希望别人修改,访问你的数据
Context.MODE_PRIVATE

如果我们希望每次存取数据 都是以追加方式 
Context.MODE_APPEND 默认文件的访问修饰权限 是私有

———————linux文件访问权限
以私有方式创建的文件  permissions -rw-rw----
全局可读            -rw-rw-r--
全局可写          -rw-rw--w-
全局可读写                        -rw-rw-rw-

linux 系统的文件的访问权限 
- | rw- |  rw-   | ---

第一个 - 代表文件
       d 代表目录

最后面三个:
android下面每一个应用程序,操作系统都会给他分配一个用户名 。
linux下通过用户组,来设置应用是否让其他应用访问。


保存位置:


—————————————SharedPreferences读存数据—————————

SharedPreferences方式存储相当于JAVAEE中的properties属性文件存储

SharedPreferences其实就是往rom中存储数据,只是存储是xml文件了,SharedPreferences还对api进行了封装,这样读写更加方便。


保存位置:


—————————————————————————————————————————————————————————


—————————————往sd卡中读存数据————————————————
往sd卡中读写数据:
<!-- 在SDCard中创建与删除文件权限 -->
<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/>
<!-- 往SDCard写入数据权限 -->
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>


<think>好的,我现在需要解决用户的问题:如何在Android10及以上版本中使用最新方法将资源图片保存到相册。用户提到之前的回答和引用,我需要结合这些信息来提供最新的解决方案。首先,用户引用的内容提到了Scoped Storage和MediaStore的使用,特别是Android10及以上版本需要兼容。之前的回答中提到了使用运行时权限和MediaStore,但可能需要更具体的步骤。我需要确保方法符合最新的API要求,比如Android10引入的Scoped Storage机制,避免使用传统的文件路径,而是通过ContentResolver和MediaStore来操作。 接下来,用户的需求是保存资源图片到相册。资源图片可能指的是应用内的资源,比如drawable中的图片,或者是网络下载的图片。这需要明确如何将应用内部的资源图片保存到相册。如果是drawable资源,可能需要先将资源转换为Bitmap,然后保存到MediaStore中。如果是网络图片,可能需要先下载,再保存,但用户的问题明确是资源图片,所以可能需要调整步骤。 然后,需要考虑权限问题。根据引用[3],需要READ和WRITE_EXTERNAL_STORAGE权限,但在Android10及以上,使用ScopedStorage后,可能不再需要这些权限,特别是当应用在沙盒内操作时。不过,如果要将图片保存到公共目录,如Pictures,可能需要使用MediaStore并请求相应的权限。或者,可能不需要权限,因为MediaStore允许应用插入条目到公共集合中,而无需WRITE权限。这点需要确认最新的文档,避免给出错误的信息。另外,引用[2]提到使用MediaStore来操作多媒体数据库,特别是MediaStore.Images.Media.insertImage方法,但这个方法可能在API29之后有所变化。需要检查最新的Android文档,确认insertImage是否仍然适用,或者是否有更好的方法,比如使用ContentValues和ContentResolver.insert。还需要考虑如何更新媒体库,以便新保存的图片能立即出现在相册应用中。传统的方法是发送广播,但Android10之后可能不再推荐使用广播,而是依赖MediaStore的插入操作自动通知媒体扫描器。或者,可能需要使用MediaScannerConnection扫描文件,但如果是通过MediaStore插入的,可能不需要额外步骤。 现在,我需要整理具体的实现步骤:1.将资源图片转换为Bitmap。例如,从drawable中获取图片。 2.使用MediaStore API将Bitmap保存到公共的Pictures目录。3.构建ContentValues,设置文件名、MIME类型、相对路径等。 4.使用ContentResolver插入数据,获得URI。5.通过URI打开OutputStream,将Bitmap入。6.可能需要处理Android版本差异,特别是针对Android10及以上。 关于权限部分,根据Android文档,从Android10开始,应用在访问自己的沙盒文件时不需要权限,但若要将文件添加到公共集合(如Pictures、Downloads),可能需要WRITE_EXTERNAL_STORAGE权限,但自Android13(API33)开始,这个权限被细化,可能需要不同的权限。或者,使用MediaStore.insertImage可能不需要该权限,因为应用在向媒体库添加条目时有权限。需要确认这一点,可能需要检查最新的权限要求,或者建议用户声明权限以确保兼容性。另外,用户提供的引用[4]中有一个将网络图片转换为字节数组的方法,但用户的问题是关于资源图片,所以可能需要调整这部分代码,改为从资源获取Bitmap。最后,需要编示例代码,展示如何正确实现这些步骤,并处理可能的异常,比如IO异常。同时,提醒用户注意Android版本兼容性,使用最新的API方法,如MediaStore API,而不是传统的FileAPI。</think>### Android 10+ 保存资源图片到相册的最新实现方法 从 Android 10(API 29)开始,Google 引入 **Scoped Storage** 机制,传统文件路径操作已不推荐使用。以下是基于 `MediaStore` 的最新实现方式: --- #### 1. 声明权限(可选但建议) 在 `AndroidManifest.xml` 中声明权限(仅需在需要兼容低版本时添加): ```xml <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" android:maxSdkVersion="32" /> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" android:maxSdkVersion="32" /> ``` > **注意**:Android 13+ 的 `MANAGE_EXTERNAL_STORAGE` 权限仅适用于文件管理器类应用[^3]。 --- #### 2. 使用 `MediaStore` 保存图片 通过 `ContentResolver` 直接操作多媒体数据库,无需请求存储权限(Android 10+ 默认允许向公共目录插入文件)[^2]: ```kotlin fun saveImageToGallery(context: Context, bitmap: Bitmap, fileName: String): Uri? { val contentValues = ContentValues().apply { put(MediaStore.Images.Media.DISPLAY_NAME, "$fileName.jpg") put(MediaStore.Images.Media.MIME_TYPE, "image/jpeg") if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) { put(MediaStore.Images.Media.RELATIVE_PATH, Environment.DIRECTORY_PICTURES) put(MediaStore.Images.Media.IS_PENDING, 1) } } val resolver = context.contentResolver val uri = resolver.insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, contentValues) uri?.let { try { resolver.openOutputStream(it).use { outputStream -> bitmap.compress(Bitmap.CompressFormat.JPEG, 100, outputStream) } if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) { contentValues.clear() contentValues.put(MediaStore.Images.Media.IS_PENDING, 0) resolver.update(uri, contentValues, null, null) } return uri } catch (e: IOException) { resolver.delete(uri, null, null) return null } } return null } ``` --- #### 3. 调用示例 保存 `drawable` 资源图片到相册: ```kotlin // 从资源获取Bitmap val bitmap = BitmapFactory.decodeResource(resources, R.drawable.your_image) // 调用保存方法 val savedUri = saveImageToGallery(this, bitmap, "my_photo") if (savedUri != null) { Toast.makeText(this, "图片已保存到相册", Toast.LENGTH_SHORT).show() } else { Toast.makeText(this, "保存失败", Toast.LENGTH_SHORT).show() } ``` --- #### 关键点说明 1. **`RELATIVE_PATH`**:指定保存到 `Pictures` 目录(Android 10+ 必须使用此方式) 2. **`IS_PENDING`**:标记文件入状态,避免其他应用访问未完成的文件[^2] 3. **兼容性处理**:通过 `Build.VERSION.SDK_INT` 区分不同系统版本逻辑 4. **自动媒体扫描**:通过 `MediaStore` 插入的图片会触发系统自动更新相册[^1] --- ### 兼容性优化建议 - **Android 13+**:如需访问其他应用创建的文件,需申请 `READ_MEDIA_IMAGES` 权限 - **低版本兼容**:若需支持 Android 9 及以下,可结合 `File` API 和 `MediaScannerConnection`[^1] ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值