我正在为我的 Android 应用实现导入功能。我想让用户选择他们想要从他们设备上的外部存储(确切地说是下载目录)和其他在线文件存储(如 DropBox 和 Google Drive)导入的文件。
我实现了它并在一个模拟器和两个安卓设备上进行了测试。当我在模拟器上测试它时,Android 版本 6.0,因为它没有安装 DropBox 和 GoogleDrive,我看到了我所期待的,它能够从下载目录中选择一个文件:

当我在 Google Pixel 手机 Android 版本 7.1.2 上对其进行测试时,一切都按我的预期工作。我可以从下载目录、Google Drive 和 DropBox 中选择一个文件:

但是,当我在三星 Galaxy 4 设备 Android 版本 5.0.1 上对其进行测试时,我可以从 Google Drive 和 Dropbox 中选择一个文件,但是我无法从我的下载目录中选择一个文件:

这是我选择文件的代码:
Intent intent = new Intent(Intent.ACTION_GET_CONTENT);
intent.setType("text/*");
startActivityForResult(intent, GET_FILE_RESULT_CODE);
Run Code Online (Sandbox Code Playgroud)
请让我知道我可以做些什么来解决这个问题。谢谢!
android android-intent android-file android-external-storage android-storage
假设一个 Uri 可以是以下之一:
在这两种情况下,它都指目录下的文件。
有没有一种直接的方法来获取其父目录的 Uri 而不尝试两者中的每一个来查看哪个有效?
[编辑]:以下是 SAF 的示例:
乌里:
content://com.android.externalstorage.documents/tree/0000-0000%3Atest/document/0000-0000%3Atest%2Ffoo%2FMovies%2FRR%20parking%20lot%20a%202018_02_22_075101.mp4
Run Code Online (Sandbox Code Playgroud)
获取路径():
/tree/0000-0000:test/document/0000-0000:test/foo/Movies/RR 停车场 a 2018_02_22_075101.mp4
getPathSegments():
0 = "tree"
1 = "0000-0000:test"
2 = "document"
3 = "0000-0000:test/foo/Movies/RR parking lot a 2018_02_22_075101.mp4"
Run Code Online (Sandbox Code Playgroud)
父文件夹应该是 test/foo/Movies。
以下是常规文件的示例:
乌里:
file:///storage/emulated/0/foo/Movies/RR%20parking%20lot%20a%202018_02_22_081351.mp4
获取路径():
/storage/emulated/0/foo/Movies/RR 停车场 a 2018_02_22_081351.mp4
getPathSegments():
0 = "storage"
1 = "emulated"
2 = "0"
3 = "foo"
4 = "Movies"
5 = "RR parking lot a 2018_02_22_081351.mp4"
Run Code Online (Sandbox Code Playgroud) 我有一个应用程序,当我按下按钮时,它应该打开文件夹选择器并允许用户仅浏览和选择文件夹。然后我想获取该文件夹的路径,以便我可以对其进行一些操作。
我尝试过使用这段代码:
val intent = Intent(Intent.ACTION_GET_CONTENT)
intent.type = "*/*"
startActivityForResult(intent, 8778)
Run Code Online (Sandbox Code Playgroud)
但这不起作用。
您能帮我提供一些代码吗?
我有一个将视频录制到共享 MOVIES 文件夹的应用程序。
我可以使用contentResolver.delete(uri, null, null)我录制的视频活动中的方法删除 Android 11 (API 30) 上的这些文件。
但是,如果我重新安装该应用程序,那么它就会失去对这些文件的权限......(如此糟糕),在这种情况下,我需要做这样的事情:
try {
context.contentResolver.delete(uri, null, null)
} catch (exception: Exception) {
if (exception is RecoverableSecurityException) {
val intentSender = exception.userAction.actionIntent.intentSender
intentSender?.let {
callback?.startIntentSenderForResult(
intentSender,
requestCode
)
}
}
}
Run Code Online (Sandbox Code Playgroud)
因此它无法删除文件,ContentResolver因为应用程序已重新安装,并且有一个例外,我们可以捕获并打开下一个烦人的对话框以供用户确认删除(并且对于每个文件删除,它应该是一个不同的对话框,多次删除 - 否道路)
然后我在这个 Android 11 设备(模拟器)上安装了来自 Google Play 的 Explorer 应用程序,当我打开它时,该应用程序只要求存储写入权限(我的应用程序也这样做)并且这个 Explorer 应用程序可以轻松删除任何文件(包括我录制的视频)文件)没有任何确认对话框。
那么他们是如何做到的呢?这是一个黑客还是什么?
链接到应用程序https://play.google.com/store/apps/details?id=com.speedsoftware.explorer
更新
VLC for Android 也可以删除任何媒体文件https://play.google.com/store/apps/details?id=org.videolan.vlc
他们也使用内容提供程序,所以它是一样的,但它返回的true不像我的应用程序,为什么?
fun deleteFile(file: File): Boolean {
var deleted: Boolean
//Delete from …Run Code Online (Sandbox Code Playgroud) 我想从互联网上下载一些音频文件。我想使用downloadmanager下载这个文件,但我不知道如何将这些文件保存到android中的特定内部存储位置。InternalStorage/folder/filename.mp3(这样我就可以轻松访问它们)。
manager = (DownloadManager) getSystemService(Context.DOWNLOAD_SERVICE);
Uri uri = Uri.parse("URL");
DownloadManager.Request request = new DownloadManager.Request(uri);
request.setNotificationVisibility(DownloadManager.Request.VISIBILITY_VISIBLE);
long reference = manager.enqueue(request);
Run Code Online (Sandbox Code Playgroud)
对于下载很有用。但我们无法指定这些文件的位置。
那么如何指定这些文件保存在内部存储的特定位置呢?还有,如何access使用delete这些文件。
请不要提出这个问题,因为我在阅读很多文章时感到困惑。
如果有其他更好的选择或任何建议请评论
android android-download-manager android-internal-storage android-storage
我正在尝试递归地遍历 Android DocumentFile 树,但无法获取要为子文件夹返回的文件列表。当我在文件夹 URI 上尝试 listFiles() 时,每次都会返回根文件列表。
为什么这不起作用?
package com.example.usbfoldertest;
import androidx.appcompat.app.AppCompatActivity;
import androidx.documentfile.provider.DocumentFile;
import android.content.Intent;
import android.net.Uri;
import android.os.Bundle;
import android.util.Log;
public class MainActivity extends AppCompatActivity {
private static final String TAG = "USBFolderTest";
private static final int RQS_OPEN_DOCUMENT_TREE = 2;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Intent intent = new Intent(Intent.ACTION_OPEN_DOCUMENT_TREE);
startActivityForResult(intent, RQS_OPEN_DOCUMENT_TREE);
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
if(resultCode == RESULT_OK && requestCode == RQS_OPEN_DOCUMENT_TREE){
Uri uriTree = data.getData(); …Run Code Online (Sandbox Code Playgroud) 此代码适用于媒体文件我想要文档文件的解决方案
我不知道如何为文档文件添加 contentValues
fun getFile(fileName: String): File? {
with(sharePrefHelper.app){
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
val values = ContentValues()
// Here is My Question That what should i Do Here Because this is for document not for image
values.put(MediaStore.Images.Media.DISPLAY_NAME, fileName)
// for MIME_TYPE "image/jpg" this is working
values.put(MediaStore.Images.Media.MIME_TYPE, "text/csv")
values.put(MediaStore.MediaColumns.RELATIVE_PATH, "DCIM/Donny")
contentResolver.insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, values)?.let {
it.path?.let { finalPath ->
return File(finalPath)
}
}
} else {
val directory: File = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DCIM + "/Donny")
if (!directory.exists()){
directory.mkdirs()
}
return File(directory, fileName)
}
return …Run Code Online (Sandbox Code Playgroud) 我正在尝试获取应用程序包占用的大小.每个应用程序在内部/外部存储中都有一个位置.
我想计算以下目录的大小,我该怎么做?我知道我可以在Oreo(API 26)设备上使用StorageStateManager,但是如何在oreo设备之前实现这一点.
应用目录: /Android/data/myapplicationpackage
我正在尝试使用PackageStats,但它总是给我零.使用此代码的实际方法是什么?
我使用了以下代码,它给了我全部零.
PackageStats stats = new PackageStats(context.getPackageName());
long codeSize = stats.codeSize + stats.externalCodeSize;
long dataSize = stats.dataSize + stats.externalDataSize;
long cacheSize = stats.cacheSize + stats.externalCacheSize;
long appSize = codeSize + dataSize + cacheSize;
Run Code Online (Sandbox Code Playgroud) 所以这是场景:
我正在从网络下载 PDF 并将其保存在/0/Download/NSIT - Notices/"fileName".pdf
现在发送 Intent 像这样:
private void openPDF(String fileName) {
Log.d(TAG, "openPDF: called");
Intent intent = new Intent(Intent.ACTION_VIEW);File(Environment.getExternalStorageDirectory().getAbsolutePath() + "/Download", "NSIT - Notices");
File myPDF = new File(Environment.getExternalStorageDirectory() + "/Download/NSIT - Notices", fileName + ".pdf");
Uri uri = FileProvider.getUriForFile(context, BuildConfig.APPLICATION_ID + ".provider", myPDF);
Log.d(TAG, "openPDF: intent with uri: " + uri);
intent.setDataAndType(uri, "application/pdf");
context.startActivity(Intent.createChooser(intent, "Open with..."));
}
Run Code Online (Sandbox Code Playgroud)
现在任何 PDF 阅读器(Google Drive PDF 阅读器、系统 PDF 查看器)都在说
The File Does Not Exist
Run Code Online (Sandbox Code Playgroud)
谷歌没有做任何事情(这就是为什么不包括它的图像)
Mainfest.xml
<provider
android:name="android.support.v4.content.FileProvider" …Run Code Online (Sandbox Code Playgroud) pdf android android-intent android-fileprovider android-storage
在问这个问题之前我进行了很多搜索和尝试。但我尝试的所有代码都不起作用。我希望该文件存储在该download文件夹中,并且在用户卸载该应用程序时也可以访问该文件。我也尝试过使用opencsv库。您能否提供一种tested创建csv或txt文件并将其存储到download文件夹的方法?
csv android opencsv android-download-manager android-storage
android-storage ×10
android ×9
android-file ×4
android-11 ×1
csv ×1
documentfile ×1
java ×1
kotlin ×1
opencsv ×1
pdf ×1