Android Studio:Drive API废弃后实现用户偏好的谷歌云盘存读
Android 端谷歌云盘保存/加载用户偏好方案(适配2023年后API)
核心方案选择
旧Drive API已废弃,且不能要求用户操作开发者控制台,推荐使用Google Drive for Android 内置存储访问框架(SAF)——这是系统原生支持的方式,无需额外配置开发者控制台,仅需用户授权账号即可完成操作。
关键步骤及代码示例
1. 权限配置
在AndroidManifest.xml中添加必要权限:
<uses-permission android:name="android.permission.INTERNET" /> <!-- 可选:如需后台访问可添加,常规场景无需 --> <uses-permission android:name="android.permission.MANAGE_DOCUMENTS" />
2. 触发用户选择云盘位置(首次保存)
让用户在谷歌云盘中指定保存位置或直接创建新文件:
// 定义请求码 private const val REQUEST_CODE_CREATE_FILE = 1001 // 创建保存文件的Intent val intent = Intent(Intent.ACTION_CREATE_DOCUMENT).apply { addCategory(Intent.CATEGORY_OPENABLE) type = "text/plain" putExtra(Intent.EXTRA_TITLE, "user_preferences.txt") // 默认文件名 // 限定仅谷歌云盘应用响应 putExtra("android.provider.extra.INITIAL_URI", Uri.parse("content://com.google.android.apps.docs.storage/document/acc=1;typ=doc;")) } startActivityForResult(intent, REQUEST_CODE_CREATE_FILE)
3. 写入用户偏好数据
在onActivityResult中处理返回结果并写入数据:
override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { super.onActivityResult(requestCode, resultCode, data) if (requestCode == REQUEST_CODE_CREATE_FILE && resultCode == RESULT_OK) { data?.data?.let { uri -> contentResolver.openOutputStream(uri)?.use { outputStream -> val preferencesStr = "theme=dark;notifications=on;auto_sync=on" // 你的偏好字符串 outputStream.write(preferencesStr.toByteArray()) } } } }
4. 加载用户偏好数据
触发选择已保存的TXT文件并读取数据:
private const val REQUEST_CODE_OPEN_FILE = 1002 // 创建打开文件的Intent val intent = Intent(Intent.ACTION_OPEN_DOCUMENT).apply { addCategory(Intent.CATEGORY_OPENABLE) type = "text/plain" // 限定仅谷歌云盘应用响应 putExtra("android.provider.extra.INITIAL_URI", Uri.parse("content://com.google.android.apps.docs.storage/document/acc=1;typ=doc;")) } startActivityForResult(intent, REQUEST_CODE_OPEN_FILE)
读取数据的处理逻辑:
override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { super.onActivityResult(requestCode, resultCode, data) if (requestCode == REQUEST_CODE_OPEN_FILE && resultCode == RESULT_OK) { data?.data?.let { uri -> contentResolver.openInputStream(uri)?.use { inputStream -> val preferencesStr = inputStream.bufferedReader().readText() // 将字符串解析为应用内的偏好配置 } } } }
5. 持久化访问权限(可选)
若不想每次都让用户选择文件,可请求持久化权限:
data?.data?.let { uri -> val takeFlags = Intent.FLAG_GRANT_READ_URI_PERMISSION or Intent.FLAG_GRANT_WRITE_URI_PERMISSION contentResolver.takePersistableUriPermission(uri, takeFlags) }
注意事项
- 该方案完全依赖系统原生SAF,无需配置开发者控制台,用户仅需登录谷歌账号即可操作。
- 无需集成旧Drive API或Drive REST API,适配2023年后的API变动。
- 文件存储位置由用户选择,符合隐私规范,用户可完全掌控自己的文件。
内容的提问来源于stack exchange,提问作者RayC
相关产品推荐
相关产品推荐

