我有一个类似于资源管理器的应用程序,允许用户共享文件夹,多个文件夹和多个文件。共享意图最终将保存所有共享文件的列表。
如果用户共享一个包含1000个文件的文件夹,那就太多了。但是,如何确定是否可以共享用户选择的文件数量?
我想检查是否可以分享用户选择的文件数量,如果没有,我想告诉他,他选择了很多文件并达到了Android限制。在最好的情况下,我想告诉他,他的共享意图是2.5MB,限制是1MB,所以他可以自己估计他应该选择多少文件......
问题
修改
消除混淆:
我不是直接在intent中共享文件,而只是文件的URI或相对路径。因此,URI的长度或相对路径的长度对于intent的大小很重要,但是如果它指向大文件或小文件则不重要。
1MB的限制对于意图(我认为是有意的)是有效的,如果意图适用于大量数据,那么它将失败并且问题是
我正在寻找一个可重复使用的解决方案,适用于任何意图!我有时会添加共享目标,有时候不会。
答案 0 :(得分:1)
意图:
您可以将该intent对象写入Parcel
并使用dataSize()
方法获取该intent中包含的序列化数据大小。确保事后recycle()
包裹。
final Intent testIntent = getIntent();
final Parcel testParcel = Parcel.obtain();
try {
testParcel.writeParcelable(testIntent,0);
Log.i("TEST", String.format("Intent size: %s", testParcel.dataSize()));
}finally {
testParcel.recycle();
}
对于文件:
如果您可以从意图中检索文件名列表,那么您可以查询每个文件大小并总结它:
sizeBytes += new File(filePath).length();
对于目录,您需要走路并添加其下所有文件的大小。您可以使用DirectoryWalker类。
答案 1 :(得分:0)
为什么不调用shell命令来获取文件大小?
它不会确切地确定意图大小,但会给你一个很好的预测。
try {
Process process = Runtime.getRuntime().exec("ls -l");
BufferedReader in = new BufferedReader(new InputStreamReader(process.getInputStream()));
} catch (InterruptedException e) {
e.printStackTrace();
}
确保您不使用awk
和其他在某些设备上无法使用的设备。
对于目录大小,您需要使用与ls
不同的内容。
答案 2 :(得分:0)
将更明智的案例编号放在上面可能更有意义。 " 1MB/256 = 4096
"将是一个有用的信息。告诉用户他们分享太多字节会让你感到困惑,因为你指的是文件名的长度,而不是文件的大小。
最糟糕的案例名称是127 characters or 255 bytes。
export class User {
id: number;
email: string;
created_at: string;
first_name: string;
last_name: string;
deleted_at: any;
name() {
if (this.deleted_at === null) {
return this.first_name;
} else {
return 'DELETED';
}
}
}
所以,我认为4000会有风险,但2000-3000应该没问题,具体取决于你剩余负载的大小。
如果您认为用户不够,那么您需要一个不同的解决方案,而不是警告。
答案 3 :(得分:0)
您可以做的是保持对正在选择的文件名长度的引用,以避免以后循环使用。
1个字符= 1个字节。所以,大约1000个字符等于1千字节。
因此,基于此,您可以限制用户选择并能够在他们选择文件时实际告诉他们,他们达到了要选择的最大文件数(一般消息)。示例代码:
private int maxLength = 0;
onSelectFile(File file){
maxLength += file.getName().length()
if(maxLength < 1mb ){//display massage and dont add the new selected file}
}
答案 4 :(得分:0)
我认为没有直接的检查方法,但您可以对其进行手动操作以获得您的意图大小。
考虑到Intent implements Parcelable
您应该能够获得Parcel
,写入它,并在发送/启动意图之前检查它的大小。这样的事情:
Intent intent = ....
... do your intent and fill with the URI data.
Parcel parcel = Parcel.obtain();
intent.writeToParcel(parcel, 0);
int size = parcel.dataSize(); // HERE IS THE NUMBER YOU WANT TO CHECK
parcel.recycle(); // don't forget to return the parcel to the system
parcel = null;
我不确定该大小是否以字节为单位,但它应该是。如果您希望官方文档在https://developer.android.com/reference/android/os/Parcel.html
在用户体验笔记中,您可能希望在用户选择内容时继续检查大小,以便一旦达到限制,您就可以阻止用户选择任何额外的内容,并且您不会浪费用户时间。