- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我使用附加功能共享媒体并遇到以下问题:如果我共享太多项目,共享 Intent 会无提示地失败。日志或类似内容中没有调试消息,也没有延迟选择目标表...如果我共享太多项目,什么也不会发生。大约 50 个项目似乎是极限......
有人知道为什么会这样吗?或者有解决方案吗?有没有办法查明我是否共享了过多的 URI?
public static void shareMediaUris(Activity activity, ArrayList<Uri> uris)
{
Intent sharingIntent = new Intent(Intent.ACTION_SEND_MULTIPLE);
sharingIntent.setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);// | Intent.FLAG_ACTIVITY_NEW_TASK);
sharingIntent.setType("*/*");
String[] mimetypes = {"image/*", "video/*"};
sharingIntent.putExtra(Intent.EXTRA_MIME_TYPES, mimetypes);
sharingIntent.putParcelableArrayListExtra(Intent.EXTRA_STREAM, uris);
finishShare(activity, sharingIntent);
}
public static void finishShare(Activity activity, Intent intent)
{
List<ResolveInfo> resolveInfo = MainApp.get().getPackageManager().queryIntentActivities(intent, 0);
if (!resolveInfo.isEmpty())
{
for (int i = resolveInfo.size() - 1; i >= 0; i--)
{
if (resolveInfo.get(i).activityInfo.packageName.equals(MainApp.get().getPackageName()))
resolveInfo.remove(i);
}
if (resolveInfo.size() == 0)
activity.startActivity(Intent.createChooser(intent, MainApp.get().getString(R.string.share_with)));
else
{
List<Intent> targetedShareIntents = new ArrayList<Intent>();
for (int i = 0; i < resolveInfo.size(); i++)
{
Intent targetedShareIntent = (Intent) intent.clone();
targetedShareIntent.setPackage(resolveInfo.get(i).activityInfo.packageName);
targetedShareIntent.setClassName(resolveInfo.get(i).activityInfo.packageName, resolveInfo.get(i).activityInfo.name);
targetedShareIntents.add(targetedShareIntent);
}
Intent chooserIntent = Intent.createChooser(targetedShareIntents.remove(targetedShareIntents.size() - 1), activity.getString(R.string.share_with));
chooserIntent.putExtra(Intent.EXTRA_INITIAL_INTENTS, targetedShareIntents.toArray(new Parcelable[targetedShareIntents.size()]));
activity.startActivity(chooserIntent);
}
}
else
activity.startActivity(Intent.createChooser(intent, MainApp.get().getString(R.string.share_with)));
}
最佳答案
以下是 Google 的问题跟踪器对这个问题的了解:Issue 5878: Intent Extras Have Size Limitation . IE。这是“设计”行为。
我设法重现了它。如果我分享 500 个 URI
,它会起作用,如果我分享 1000 个 URI
,它会静静地什么也不做(我相信,这正是你的经验),如果我分享几千个 -它崩溃了(大小限制,请参阅我的原始答案部分)。
我查看了Android的源代码。
在 Instrumentation
类中,此代码段启动选择器 Activity ,而不是启动选择器 Activity 或崩溃,取决于 Intent
中的 Bundle
的大小.
int result = ActivityManagerNative.getDefault()
.startActivity(whoThread, who.getBasePackageName(), intent,
intent.resolveTypeIfNeeded(who.getContentResolver()),
token, target != null ? target.mEmbeddedID : null,
requestCode, 0, null, options);
更准确地说,Binder
类的transactNative()
方法:
public boolean transact(int code, Parcel data, Parcel reply, int flags) throws RemoteException {
Binder.checkParcel(this, code, data, "Unreasonably large binder buffer");
return transactNative(code, data, reply, flags);
}
在这两种非崩溃情况下,它都返回 0 作为结果,即 ActivityManager.START_SUCCESS
。不仅如此,正在调用原始 Activity 的 onPause()
!
唯一的区别是它会立即调用原始 Activity 的onResume()
,您可以将其用作提示,表明出了点问题。
但总的来说,由于“选择器尚未启动”和应用程序崩溃之间的界限非常模糊:
E/JavaBinder: !!! FAILED BINDER TRANSACTION !!! (parcel size = 3100860)
我建议
限制应用内可能共享项目的数量以避免这种行为
将 startActivity(chooserIntent)
包装到 try-catch
block 中,以避免由于 TransactionTooLargeException
如果在 startActivity(chooserIntent)
之后未抛出异常,但调用了原始 Activity 的 onResume()
- 将其视为异常(即通知用户,存在技术问题,用户必须选择较少的项目来分享)
原始答案:我认为,您只是受制于 Intent
的 size-limit Bundle
- 大约 1MB
有一篇不错的文章,在此处对其进行了描述:Yet another post on Serializable vs Parcelable
你可以在这里阅读更多相关信息:Is there some limits in android' bundle?
关于android - 共享 Intent - 如果共享的项目太多,则静默失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34464111/
只是想知道是否有可能找出谁从 Windows 共享中读取了文件(最好使用 .NET,但 win32 native 可以)? 我想做的是创建类似 awstats 的东西对于 Windows 共享,这样我
是否可以列出 Intent.ACTION_SEND ?我的意思是我需要知道是否有人通过 action_send 在 Facebook 上分享或在 Twitter 上发推文。 最佳答案 也许你想要一个更
我正在使用 Google Apps 应用程序。实际上,我想在不使用密码的情况下访问另一个 ID。我使用了 OAuth,它运行良好。但我无法分享特定人的日历。我尝试了以下代码。 GoogleOAuthP
我怎样才能只创建模拟器...可能吗?我知道,设备需要分发证书。 最佳答案 您只需将应用程序目录从 iPhone 模拟器复制到另一个实例/操作系统版本,它就应该可以工作。 因此,如果您想分发 3.1.3
我想使用多阶段构建来避免每次构建应用程序时都下载我的 Java 项目所需的所有 Maven 依赖项。 我正在考虑在第一阶段解决 Maven 依赖项,然后在第二阶段构建应用程序,这将需要访问在前一阶段下
我正在寻找保护用户下载内容的初步想法。用户下载充满有趣资源的 zip 文件,这些资源被提取到本地文件系统中以供应用程序使用。我的目标是防止用户通过互联网将下载的资源共享给其他用户(假设他们获得了对文件
我想知道在具有移动和桌面版本的网站上共享身份验证、 session 管理等的最佳方法是什么。我们正在运行 Tomcat,并且更愿意将移动站点和桌面站点的应用程序保持在不同的节点上。 我看过类似的帖子,
我发现了这个单例的实现。我怎样才能创建指向它的指针或共享指针?` 为什么这不起作用?自动测试 = Singleton::Instance(); class Singleton { public: st
我有一个 heroku 项目,我想与其他人分享。作为the instructions describe ,我使用 virtualenv 来管理环境和依赖项。有没有办法在新机器上从 requiremen
Maven 将所有 jar 存储在本地存储库 ~/.m2/repository/ 下。用户多时占用空间大。 那么,是否可以由多个用户共享这个本地存储库,或许在不同的目录结构下? 最佳答案 简单的回答
为什么共享 worker 在重新加载页面时死了?应该是复活了我该如何解决这个问题? 重装前 重新加载后(在example.com上按F5) parent worker var port = new S
我正在开发多个小型应用程序,这些应用程序将共享通用和共享模块和 Assets 。 关于如何创建项目结构的部分在这里回答:https://stackoverflow.com/a/61254557/135
我在 RHEL 上安装了 jenkins (localhost:8080),我能够成功地构建代码 现在,我想设置主/从代理。 我的笔记本电脑将充当“Master Jenkins”,而我同事的笔记本电脑
我有这种方法可以根据我使用的 EXTRA_STREAM 共享文本文件或图片。我有这两个我可以选择 i.putExtra(Intent.EXTRA_STREAM, uri); i.putExtra(In
我正在使用 R 中的一个数据分析项目,我正在使用 R 中的敏感私有(private)数据进行一些逻辑和多级建模。我爱上了 。预订 包,我已经创建了一本关于我们的工作流程和分析管道的相当广泛的书。问题是
我正在构建的应用程序需要在 UITabBarController 框架内为多个 View (及其 subview )显示共享的自定义 UIToolbar。自定义工具栏的内容在所有 View 中都是相同
我有多个应用程序,我想共享相同的 eslint 配置: - project_root/ - app1/ - node_modules/ - eslint.rc
我有多个 Electron 应用程序。一个是主应用程序,其他几个功能应用程序。主应用程序上的按钮很少,这将导致功能应用程序打开。这里的问题是每个应用程序都有一个主进程,该进程导致要利用更多的CPU。是
我正在开发一个 Node.js 后端,它通过 websocket 与一些桌面客户端进行通信,而服务器端的通信是从 Web 前端发起的。一切正常,因为我将 SockJS Connection 实例存储在
我对托管多个网站的服务器上的多个用户帐户使用私有(private) SSH key 和无密码条目。 我为每个用户帐户使用相同的私钥。 (因为我很懒?或者那是“正确”的方式)。 我现在想授权该国不同地区
我是一名优秀的程序员,十分优秀!