确定共享数据时是否超过1MB限制

时间:2016-05-23 07:29:28

标签: android android-intent bundle

我有一个类似于资源管理器的应用程序,允许用户共享文件夹,多个文件夹和多个文件。共享意图最终将保存所有共享文件的列表。

如果用户共享一个包含1000个文件的文件夹,那就太多了。但是,如何确定是否可以共享用户选择的文件数量?

我想检查是否可以分享用户选择的文件数量,如果没有,我想告诉他,他选择了很多文件并达到了Android限制。在最好的情况下,我想告诉他,他的共享意图是2.5MB,限制是1MB,所以他可以自己估计他应该选择多少文件......

问题

  • 是否可以确定共享意图是否< 1MB因此可以共享吗?
  • 是否可以确定共享意图的大小?

修改

消除混淆:

我不是直接在intent中共享文件,而只是文件的URI或相对路径。因此,URI的长度或相对路径的长度对于intent的大小很重要,但是如果它指向大文件或小文件则不重要。

1MB的限制对于意图(我认为是有意的)是有效的,如果意图适用于大量数据,那么它将失败并且问题是

我正在寻找一个可重复使用的解决方案,适用于任何意图!我有时会添加共享目标,有时候不会。

5 个答案:

答案 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

在用户体验笔记中,您可能希望在用户选择内容时继续检查大小,以便一旦达到限制,您就可以阻止用户选择任何额外的内容,并且您不会浪费用户时间。