Android提供以下数据存储选项:
共享首选项 - 将私有原始数据存储在键值对中.
内部存储 - 将私有数据存储在设备内存中.
外部存储 - 将公共数据存储在共享外部存储上.
SQLite数据库 - 将结构化数据存储在私有数据库中.
缓存 - 应用程序运行期间缓存数据.(可能在空间不足时可以清楚)
我想知道的是这些存储的生命周期.
这个问题的一个扩展是,使用哪个存储我的数据在丢失和未授权资源(用户,root用户的应用程序)访问方面更安全.
security android lifetime android-sqlite android-external-storage
我对Android 6(Marshmallow)运行时权限有疑问.如果用户想要从图库中选择照片,我们是否应该请求READ_EXTERNAL_STORAGE许可?
好像我可以访问图库,即使我关闭存储权限.
android-gallery android-external-storage android-6.0-marshmallow runtime-permissions
我想AndroidTest为某个应用编写一个涉及写入外部存储的应用,但是以某种方式我无法使其正常工作。(在Pixel2,Lg G6,Huawai P8等多种设备上进行测试)
因此,我简化了所有操作,只是为了测试是否可以完全写入外部存储。我尝试了GrantPermissionRule并在Granter上进行了编写,但没有成功。
我可能最终做了太多不必要的事情,所以这是我所做的:
AndroidStudioAndroidManifest与uses-permission标签PermissionRequester 以下是上面编号列表引用的摘录
2。
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.company.android.testpermissions">
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="com.company.TestPermissions"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/AppTheme" />
</manifest>
Run Code Online (Sandbox Code Playgroud)
3。
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.company.android.testpermissions.test">
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
</manifest>
Run Code Online (Sandbox Code Playgroud)
也尝试过
<manifest package="com.company.android.testpermissions">...
Run Code Online (Sandbox Code Playgroud)
省略“测试”后缀
4。
public class MyPermissionRequester {
public static final String TAG = MyPermissionRequester.class.getSimpleName();
public static void request(String... permissions) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
UiAutomation auto = InstrumentationRegistry.getInstrumentation().getUiAutomation();
String cmd = …Run Code Online (Sandbox Code Playgroud) java testing android android-permissions android-external-storage
我在使用 api 29 和 api 30 编译的应用程序中收到了这封电子邮件。
这些应用程序不包含 requestLegacyExternalStorage标志,也不包含 MANAGE_EXTERNAL_STORAGE.
我已经在清单合并日志和最终合并的清单中搜索过,并没有requestLegacyExternalStorage在里面找到标志。
这些应用程序只有旧的和已弃用WRITE_EXTERNAL_STORAGE的AndroidManifest.xml:
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
Run Code Online (Sandbox Code Playgroud)
是否是从谷歌发出警告的旧的和已弃用的许可?从我的应用程序中删除该权限就足以解决这个问题吗?
从 5 月 5 日起,您必须让我们知道为什么您的应用需要广泛的存储访问权限
我们检测到您的应用
requestLegacyExternalStorage在manifest1 个或多个 app bundle 或 APK的文件中包含该 标志。在运行Android 11+ 的设备上使用应用的开发人员必须使用 Scoped Storage 来让用户更好地控制他们的设备存储。要在 5 月 5 日之后在Android 11或更高版本上发布您的应用,您必须:
更新您的应用程序以使用更多隐私友好的最佳实践,例如存储访问
Framework或Media Store API更新您的应用以
MANAGE_EXTERNAL_STORAGE在清单文件中声明所有文件访问 ( ) 权限,并从 5 月 5 日起在 Play 管理中心完成所有文件访问权限声明从您的应用程序中完全删除所有文件访问权限
对于面向Android 11 的应用,该 …
android android-permissions android-external-storage android-10.0 android-11
我使用下面的代码从DCIM中的Camera文件夹中获取所有图像并显示在我的应用程序中.但我想在我的应用程序中显示设备上的所有图像,无论它们存储在设备上的哪个位置.我怎样才能做到这一点?
String ExternalStorageDirectoryPath = Environment
.getExternalStorageDirectory()
.getAbsolutePath();
String targetPath = ExternalStorageDirectoryPath + "/DCIM/Camera";
images=new ArrayList<String>();
File targetDirector = new File(targetPath);
File[] files = targetDirector.listFiles();
for (File file : files) {
images.add(file.getAbsolutePath());
}
gallerylist=new CameraGalleryAdapter(getActivity().getApplicationContext(),R.layout.giphy_grid,images);
gridview.setAdapter(gallerylist);
Run Code Online (Sandbox Code Playgroud) android android-gallery android-camera android-external-storage
我正在我的应用程序中实现文件浏览器功能.我知道如何使用ACTION_OPEN_DOCUMENT_TREE意图获得外部SD卡的持久权限,以及如何使用DocumentFile类创建文件夹和删除文件/文件夹.
但是,我找不到将文件复制/移动到外部SD卡文件夹的方法.你能指出我正确的方向吗?
这真让我抓狂。我已经尝试了各种语法,但两者mkdir()并mkdirs()返回FALSE。
我的代码:
String extStorageDirectory = Environment.getExternalStorageDirectory().toString();
File folder = new File(extStorageDirectory, "myportal");
boolean bool = folder.mkdir();
File pdfFile = new File(folder, fileName);
try{
pdfFile.createNewFile();
}catch (IOException e){
e.printStackTrace();
}
FileDownloader.downloadFile(fileUrl, pdfFile);
Run Code Online (Sandbox Code Playgroud)
我正在IOException: No such file or directory尝试创建文件时。logcat 部分显示没有创建目录:
Log.d("BG", "URL: " + fileUrl);
Log.d("BG", "pdfFile: " + pdfFile);
Log.d("BG", "Ext Storage: " + extStorageDirectory);
Log.d("BG", "Ext storage state: " + Environment.getExternalStorageState().toString());
Log.d("BG", "Mkdir return: " + bool);
Log.d("BG", "IsDirectory: " + folder.isDirectory());
Run Code Online (Sandbox Code Playgroud)
以及打印的内容:
05-26 …Run Code Online (Sandbox Code Playgroud) 我对android开发非常陌生,请需要新手帮助...
我正在创建一个应具有2个目录,一个Databases目录和一个Images目录的应用程序,就像Whatsapp拥有的一样。
当我浏览手机时,我想在文件管理器中看到这些目录,就像看到其他应用程序文件夹一样。我尝试了在这里找到的所有内容,并通过代码在内部存储和外部存储中创建了它。该文件夹似乎已创建,但是当我浏览手机的文件管理器时,找不到带有应用程序名称的文件夹,而在其中没有我的数据库和图像文件夹...我在做什么错?我需要在android studio中创建这些文件夹作为添加文件夹吗?还是我需要通过代码创建它?
您能给我完成这项任务所需要做的动作吗?我正在使用android studio 3.1.3。感谢您的帮手!:)
android-external-storage android-studio android-internal-storage android-studio-3.1 android-studio-3.1.3
我正在尝试从具有以下布局的布局生成 PDF:
PdfDocument document = new PdfDocument();
PdfDocument.PageInfo pageInfo = new PdfDocument.PageInfo.Builder(2480, 3508, 0).create();
PdfDocument.Page page = document.startPage(pageInfo);
linearview.draw(page.getCanvas());
document.finishPage(page);
OutputStream outStream;
File file = new File(getExternalFilesDir(null), "pedido.PDF");
try {
outStream = new FileOutputStream(file);
document.writeTo(outStream);
document.close();
outStream.flush();
outStream.close();
Log.d(TAG, "pdf saved to " + getExternalFilesDir(null));
Intent intent = new Intent(Intent.ACTION_VIEW);
File myPDF = new File(getExternalFilesDir(null), "pedido.PDF");
Uri uri = FileProvider.getUriForFile(OrderActivity.this, BuildConfig.APPLICATION_ID + ".provider", myPDF);
Log.d(TAG, "openPDF: intent with uri: " + uri);
intent.setDataAndType(uri, "application/pdf");
startActivity(intent);
} catch (FileNotFoundException e) { …Run Code Online (Sandbox Code Playgroud) 我正在尝试将照片发送到服务器,但我无法仅在 Android 10 上访问照片。发出 READ_EXTERNAL_STORAGE 请求,单击“允许”,在设置中,允许访问存储。
显现
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
Run Code Online (Sandbox Code Playgroud)
分段
private fun haveStoragePermission() =
ActivityCompat.checkSelfPermission(requireActivity(), Manifest
.permission.READ_EXTERNAL_STORAGE)== PackageManager.PERMISSION_GRANTED
private fun requestPermission() {
if (!haveStoragePermission()) {
val permissions = arrayOf(
Manifest.permission.READ_EXTERNAL_STORAGE
)
ActivityCompat.requestPermissions(requireActivity(), permissions, STORAGE_REQUEST_PERMISSION)
}
}
Run Code Online (Sandbox Code Playgroud)
文件路径显示在日志中。绝对的,喜欢file:///emulated/0/...photo.jpg,方便,因为你可以立即上传到服务器,但毕加索和服务器不接受照片,或者说它似乎不允许读取(毕加索由于错误显示占位符)。此代码仅在您添加requestLegacyExternalStorage到清单时才有效。然后一切正常,但是这个属性在 Android 11 中消失了。我不知道为什么 10 Android 不工作,尽管在 7、8、6 上使用测试设备一切正常。
//Get images code
private fun getAllShownImagesPath(activity: Activity): ArrayList<String> {
val listOfAllImages = ArrayList<String>()
val uri: Uri = MediaStore.Images.Media.EXTERNAL_CONTENT_URI
val projection = arrayOf(
MediaColumns.DATA,
MediaStore.Images.Media.BUCKET_DISPLAY_NAME
)
val cursor = …Run Code Online (Sandbox Code Playgroud) android ×8
android-10.0 ×1
android-11 ×1
directory ×1
java ×1
kotlin ×1
lifetime ×1
pdf ×1
security ×1
testing ×1