c和c+开发安卓
C和C++是一种流行的编程语言,最初用于开发桌面应用程序和操作系统。然而,随着移动设备和运行Android操作系统的设备的普及,C和C++也成为了开发安卓应用程序的主要语言之一。开发安卓应用程序的过程有两种重要的方式:使用Java和使用本地代码。Java是安卓应用程序开发的主要语言,但C和C++提供...
2023-11-15 围观 : 2次
Android 11 引入了新的应用开发模式——Scoped Storage。Scoped Storage 是一种更加安全的文件管理方式,可以限制应用的文件共享和访问权限,防止了恶意应用窃取用户的隐私信息。不过,有时候 Scoped Storage 可能会对应用造成不必要的麻烦,比如一些旧版应用可能无法正常工作。如果你想关闭 Scoped Storage,可以按照以下步骤进行操作。
Scoped Storage 的原理
在 Android 11 中,应用的所有外部存储访问都必须使用 Scoped Storage,也就是说,应用无法直接访问外部存储的根目录和其他应用的文件。相反,Android 11 引入了一组新的 API,允许应用通过 MediaStore、Storage Access Framework(SAF)和应用专属目录来访问外部存储。这些 API 具有更加严格的权限管理机制,并且可以保护用户的隐私信息。
关闭 Scoped Storage
如果你想关闭 Scoped Storage,可以按照以下步骤进行操作:
Step 1:申请权限
首先,你需要在 AndroidManifest.xml 文件中申请 WRITE_EXTERNAL_STORAGE 权限。因为 Android 11 中的 Scoped Storage 只允许应用访问自己专属的目录,如果你想访问外部存储的其他文件,需要申请这个权限。
```
```
Step 2:配置应用专属目录
在 Android 11 中,所有应用都有一个专属的目录,可以访问这个目录下的文件,无需使用 Scoped Storage。你可以通过 Context.getExternalFilesDir() 方法获取这个目录的路径,并在其中创建自己的文件。
```
val file = File(getExternalFilesDir(null), "test.txt")
file.writeText("Hello, World!")
```
注意,这里的 getExternalFilesDir() 方法中传入的参数只是为了获取不同类型文件的目录,如果你只需要一个通用的目录,可以传入 null。
Step 3:标记文件共享
在 Android 11 中,所有应用的文件默认都是私有的,而且无法与其他应用共享。如果你想让自己的文件被其他应用访问,需要使用 MediaStore API 或 SAF(Storage Access Framework)将文件标记为共享。
使用 MediaStore API 将文件标记为共享:
```
val values = ContentValues().apply {
put(MediaStore.Audio.Media.DISPLAY_NAME, "test.mp3")
put(MediaStore.Audio.Media.MIME_TYPE, "audio/mpeg")
put(MediaStore.Audio.Media.IS_PENDING, 1)
}
val item = contentResolver.insert(MediaStore.Audio.Media.EXTERNAL_CONTENT_URI, values)
item?.let { uri ->
try {
contentResolver.openFileDescriptor(uri, "w", null).use { parcelFileDescriptor ->
if (parcelFileDescriptor != null) {
FileOutputStream(parcelFileDescriptor.fileDescriptor).use { output ->
output.write(byteArrayOf(0x00))
output.flush()
}
}
}
values.clear()
values.put(MediaStore.Audio.Media.IS_PENDING, 0)
contentResolver.update(uri, values, null, null)
} catch (e: Exception) {
e.printStackTrace()
contentResolver.delete(uri, null, null)
}
}
```
使用 SAF 将文件标记为共享:
```
val intent = Intent(Intent.ACTION_OPEN_DOCUMENT).apply {
type = "image/*"
addCategory(Intent.CATEGORY_OPENABLE)
flags = Intent.FLAG_GRANT_READ_URI_PERMISSION or Intent.FLAG_GRANT_WRITE_URI_PERMISSION
putExtra(Intent.EXTRA_TITLE, "test.jpg")
}
startActivityForResult(intent, 1001)
override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
super.onActivityResult(requestCode, resultCode, data)
if (resultCode == Activity.RESULT_OK && requestCode == 1001) {
data?.data?.also { uri ->
try {
contentResolver.takePersistableUriPermission(uri, Intent.FLAG_GRANT_READ_URI_PERMISSION or Intent.FLAG_GRANT_WRITE_URI_PERMISSION)
} catch (e: Exception) {
e.printStackTrace()
}
}
}
}
```
通过上述操作,你可以关闭 Android 11 的 Scoped Storage,让应用在外部存储中自由存储和读取文件。不过,需要注意的是,关闭 Scoped Storage 会带来一些安全风险,因此谨慎操作,确保应用的数据不会被泄露。
C和C++是一种流行的编程语言,最初用于开发桌面应用程序和操作系统。然而,随着移动设备和运行Android操作系统的设备的普及,C和C++也成为了开发安卓应用程序的主要语言之一。开发安卓应用程序的过程有两种重要的方式:使用Java和使用本地代码。Java是安卓应用程序开发的主要语言,但C和C++提供...
在软件开发的过程中,配置文件是一个非常重要的组成部分,它可以定义程序的行为和特性。由于配置文件通常是以文本形式存储的,因此在分发软件时,需要将配置文件和软件一起打包。为了方便用户使用,很多软件开发者选择将配置文件打包成exe文件,本文将介绍这种做法的原理和详细步骤。一、打包配置文件的原理将配置文件打...
在互联网时代,移动应用已成为日常生活中不可或缺的一部分。对于许多开发者来说,快速将自己的产品提供给用户是非常重要的,这就是在线打包APP的出现。本文将通过一个简单的案例,详细介绍APP在线打包的原理和操作流程,帮助开发者们更好地了解在线打包APP的工作机制以及实现方法。案例:假设我们有一个简单的HT...
苹果应用程序开发(iOS开发)是指开发基于iOS操作系统的移动设备的应用程序。iOS开发的应用程序需要使用Apple的开发工具集进行开发,其中包括Xcode IDE、Swift编程语言等。在iOS应用程序开发中,嵌套h5页面是一种常见的技术,可以实现更加复杂和灵活的界面设计和功能实现。下面具体介绍嵌...
Android系统是目前市场份额最高的移动操作系统之一,其开源性和优异的性能表现吸引了越来越多的开发者。而Linux操作系统则是Android操作系统底层的核心,支持着Android系统上许多基本的操作。在这篇文章中,我们将介绍如何在Linux环境下进行Android开发。首先,我们需要搭建Andr...