本课程教你如何产生一个在app和设备间共享数据的app。
Sharing Simple Data
Sharing Files
Sharing Files with NFC
Sharing Simple Data
Android应用最伟大之处之一就是不同应用间的通信和整合的能力。如果一个功能在其他的app里已经实现了,而这些功能并不是你的app的“主业”,为什么自己再重新实现这些功能呢?
本文讲述几种方式用来在不同的应用之间使用Intent API和ActionProvider
对象发送和接收简单数据。
Lessons
Sending Simple Data to Other Apps
学习如何通过Intent从你的application向其他的application发送文本和二进制数据
Receiving Simple Data from Other Apps
学习如何在你的application里获取从intent里传入的文本和二进制数据
学习如何在你的Action Bar里添加“share” action 条目
Sending Simple Data to Other Apps
当你构建一个intent时,你必须指定你想要该intent触发的action。Android定义了许多action,例如ACTION_SEND,该action表明intent从一个activity向另一个activity传递数据,甚至在不同进程间传递数据。为了向另一个activity发送数据,你需要做的是指定数据和类型,系统会识别能处理该intent的所有activity,然后将这些activity展示给用户(当不止一个activity时)或者立即的开启一个activity(如果仅仅有一个能处理的activity时)。相似地,你能在你的manifest文件里定义数据类型以表明你的activity能接收和处理来自其他application的哪些intent。
在不同application之间使用intent来发送和接收数据是最常见和通用的内容共享方式。Intent能让用户很快很容易的共享信息。
注:在ActionBar里添加一个共享action item的最好的方式是使用ShareActionProvider,该类在API 14及以上版本中才可用。
Send Text Content
ACTION_SEND action最直接和最通用的方式是从一个activity到另一个activity发送文本内容。例如,内建浏览器app能共享当前展示页面的URL作为文本在不同app间传递和共享。这对于在朋友和社交网络间共享文章和站点是非常有效的。如下是实现这种类型共享的代码:
Intent sendIntent = new Intent(); sendIntent.setAction(Intent.ACTION_SEND); sendIntent.putExtra(Intent.EXTRA_TEXT, "This is my text to send."); sendIntent.setType("text/plain"); startActivity(sendIntent);
如果有一个已安装的应用,该应用有一个匹配ACTION_SEND和MIME类型为text/plain的过滤器,Android系统将运行和启动该应用。如果不止一个app匹配,系统展示多选对话框(“chooser”)来让用户选择一个app。
然而,如果你调用Intent.createChooser(),传递给你的intent对象,该调用将返回你的intent的版本,总是展示该chooser。这样有一些优点:
- 即使用户先前已选择了一个默认的ACTION来处理该intent,chooser仍然将会展示给用户。
- 如果没有匹配的app,Android展示系统消息。
- 你能为chooser对话框指定一个title。
下面是更新了的代码:
Intent sendIntent = new Intent(); sendIntent.setAction(Intent.ACTION_SEND); sendIntent.putExtra(Intent.EXTRA_TEXT, "This is my text to send."); sendIntent.setType("text/plain"); startActivity(Intent.createChooser(sendIntent, getResources().getText(R.string.send_to)));
结果对话框如下图一所示:
Figure 1. Screenshot of ACTION_SEND
intent chooser on a handset.
还有一些其他的标准的extras: EXTRA_EMAIL
, EXTRA_CC
, EXTRA_BCC
, EXTRA_SUBJECT,
如果接收application不使用它们,系统简单地忽略它们。
注:一些email应用,例如Gmail,需要一个字符串数组String[]
给extras,例如 EXTRA_EMAIL
和 EXTRA_CC
, 可以使用putExtra(String, String[])
加这些到你的intent。
Send Binary Content
共享二进制数据也是使用ACTION_SEND action,需要设置合适的MIME类型,和添加URI到extra的数据里,该URI名叫EXTRA_STREAM。
这通常用于共享图片数据,但也能共享任何类型的二进制内容。
Intent shareIntent = new Intent(); shareIntent.setAction(Intent.ACTION_SEND); shareIntent.putExtra(Intent.EXTRA_STREAM, uriToImage); shareIntent.setType("image/jpeg"); startActivity(Intent.createChooser(shareIntent, getResources().getText(R.string.send_to)));注意如下几点:
- 你能使用"*/*"作为MIME类型,但是这将仅仅匹配能处理一般数据流的activity。
- 响应app需要访问URi指向数据的权限。推荐如下方式实现:
- 在你自己的
ContentProvider
存储数据 ,确保其他的app有相应的权限访问你的provider。更好的提供的访问机制是使用per-URI permissions ,该权限是临时的,仅仅保证对响应app的访问。一个容易的方式是使用FileProvider帮助类产生一个ContentProvider。 - 使用系统
MediaStore.MediaStore
其主要目的是用于视频、音频和图片MIME类型,然而,从Android3.0(API11)开始,该类也用于存储非媒体类型(seeMediaStore.Files
for more info)的数据。文件。文件能通过scanFile()
插入MediaStore。在after which acontent://
styleUri
suitable for sharing is passed to the providedonScanCompleted()
callback。注意:一旦加入到系统MediaStore,设备上的任何app都能访问存储在MediaStore里的数据。
Send Multiple Pieces of Content
为了共享多部分内容,使用ACTION_SEND_MULTIPLE
action配合一组指向内容的URIs。MIME类型依据你共享的内容而定。例如,如果你共享3个JPEG图片,MIME类型仍然是”image/jpeg“.例如如果是各种格式的图片,类型应该是”image/*",如果你正共享的是各种类型的数据,你应该使用“*/*” 像先前描述的,这决定了哪些app解析和处理你的数据。下面是一个例子:
ArrayList<Uri> imageUris = new ArrayList<Uri>(); imageUris.add(imageUri1); // Add your image URIs here imageUris.add(imageUri2); Intent shareIntent = new Intent(); shareIntent.setAction(Intent.ACTION_SEND_MULTIPLE); shareIntent.putParcelableArrayListExtra(Intent.EXTRA_STREAM, imageUris); shareIntent.setType("image/*"); startActivity(Intent.createChooser(shareIntent, "Share images to.."));
像先前所说的,确保提供的URIs指向的数据能被相应的app访问。
Receiving Simple Data from Other Apps
你的app能发送数据给其他的应用,当然,你的app也能接收来自其他app的数据。想想用户怎么和你的app交互,以及你想要从其他的app接收什么类型的数据。例如,一个社交app很可能需要接收文本内容,如来自于其他app的一个感兴趣的web URL数据。Google+ Android application既可以接收文本也可以接收图片数据。
Update Your Manifest
意图过滤器通知系统某个app的组件将接受什么意图。类似于Sending Simple Data to Other Apps这节讲的如何使用action ACTION_SEND
构造Intent,为了能接受intent,你能使用该action产生意图过滤器。你在你的manifest里使用<intent-filter>
元素定义意图过滤器。如果你的app想要处理文本类型、一种或者多种图片格式的数据,你的manifest应该如下:
<activity android:name=".ui.MyActivity" > <intent-filter> <action android:name="android.intent.action.SEND" /> <category android:name="android.intent.category.DEFAULT" /> <data android:mimeType="image/*" /> </intent-filter> <intent-filter> <action android:name="android.intent.action.SEND" /> <category android:name="android.intent.category.DEFAULT" /> <data android:mimeType="text/plain" /> </intent-filter> <intent-filter> <action android:name="android.intent.action.SEND_MULTIPLE" /> <category android:name="android.intent.category.DEFAULT" /> <data android:mimeType="image/*" /> </intent-filter> </activity>注:更多的关于意图过滤器和意图的介绍请看见Intents and Intent Filters
当另一个app通过构造一个intent试图共享如上manfest定义的数据,然后传递该intent给startActivity()
时,你的app将在intent chooser里作为一个选项被列出。如果用户选择你的app,响应的activity(对应上面例子中的.ui.MyActivity)将被调起。然后由你确定在你的代码和UI里如何处理传递过来的数据。
Handle the Incoming Content
为了处理一个intent投递过来的数据,首页调用getIntent()
得到该Intent对象。一旦你有了该对象,你能检查它里面的内容以决定接下来如何做。记住,如果activity能被系统的其他部分(例如launcher)调起,那么当你检查intent时,你将需要考虑如下问题:
void onCreate (Bundle savedInstanceState) { ... // Get intent, action and MIME type Intent intent = getIntent(); String action = intent.getAction(); String type = intent.getType(); if (Intent.ACTION_SEND.equals(action) && type != null) { if ("text/plain".equals(type)) { handleSendText(intent); // Handle text being sent } else if (type.startsWith("image/")) { handleSendImage(intent); // Handle single image being sent } } else if (Intent.ACTION_SEND_MULTIPLE.equals(action) && type != null) { if (type.startsWith("image/")) { handleSendMultipleImages(intent); // Handle multiple images being sent } } else { // Handle other intents, such as being started from the home screen } ... } void handleSendText(Intent intent) { String sharedText = intent.getStringExtra(Intent.EXTRA_TEXT); if (sharedText != null) { // Update UI to reflect text being shared } } void handleSendImage(Intent intent) { Uri imageUri = (Uri) intent.getParcelableExtra(Intent.EXTRA_STREAM); if (imageUri != null) { // Update UI to reflect image being shared } } void handleSendMultipleImages(Intent intent) { ArrayList<Uri> imageUris = intent.getParcelableArrayListExtra(Intent.EXTRA_STREAM); if (imageUris != null) { // Update UI to reflect multiple images being shared } }
注意:需要特别关注对传入的数据进行check。你不能知道一些其他的app将送你什么数据。例如,传递过来的intent里可能设置了错误的MIME类型,或者发送过来的image可能极其的大。还要记住,在单独的线程而不是主线程(UI线程)处理二进制数据。
有些UI更新可能很简单,像填充EditText一样,也有像更新图片这样的复杂的UI更新,收到数据后怎么处理和更新UI因app而异。
Adding an Easy Share Action
通过使用Android4.0(API 14)里介绍的ActionProvider能在ActionBar里容易的实现一个有效的、用户友好的共享action。ActionProvider,一旦附件到actionbar里的某天menu item,既能处理该item的展示也能该item的行为。以ShareActionProvider为例,你提供一个共享intent,剩下的事由它来做。
注:ShareActionProvider在API 14或者更高的版本才有效。
Update Menu Declarations
为了能使用ShareActionProvider,在你的menu resource 文件的相应<item>定义android: action ProviderClass属性:
<menu xmlns:android="http://schemas.android.com/apk/res/android"> <item android:id="@+id/menu_item_share" android:showAsAction="ifRoom" android:title="Share" android:actionProviderClass= "android.widget.ShareActionProvider" /> ... </menu>这表示ShareActionProvider处理item的展现和功能。然而,你需要告诉provider你想要share什么。
Figure 1. TheShareActionProvider
in the Gallery app.
Set the Share Intent
为了ShareActionProvider有效,你必须提供share intent给它。这共享intent应该和Sending Simple Data to Other Apps节里描述的相似,action为ACTION_SEND,通过extras设置EXTRA_TEXT和EXTRA_STREAM额外的数据。为了指派共享intent,首先当在Activity或者Fragment里渲染你的menu资源时找到相应的MenuItem。接下来,调用MenuItem.getActionProvider()
方法检索ShareActionProvider实例。使用 setShareIntent()
更新相关联的action item的共享意图。如下是例子:
private ShareActionProvider mShareActionProvider; ... @Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate menu resource file. getMenuInflater().inflate(R.menu.share_menu, menu); // Locate MenuItem with ShareActionProvider MenuItem item = menu.findItem(R.id.menu_item_share); // Fetch and store ShareActionProvider mShareActionProvider = (ShareActionProvider) item.getActionProvider(); // Return true to display menu return true; } // Call to update the share intent private void setShareIntent(Intent shareIntent) { if (mShareActionProvider != null) { mShareActionProvider.setShareIntent(shareIntent); } }
你可能只需要在menu产生期间设置share action一次,或者你可能当UI改变时设置或者更新它。例如,当你在Gallery app里全屏浏览照片时,share action当你在照片间滑动时改变。
更多关于ShareActionProvider
对象的讨论,参见 Action Bar guide。
相关推荐
哈希表源码
sun_3ck_03_0119
内容概要:本文档详细介绍了基于 MATLAB 实现的 LSTM-AdaBoost 时间序列预测模型,涵盖项目背景、目标、挑战、特点、应用领域以及模型架构和代码示例。随着大数据和AI的发展,时间序列预测变得至关重要。传统方法如 ARIMA 在复杂非线性序列中表现欠佳,因此引入了 LSTM 来捕捉长期依赖性。但 LSTM 存在易陷局部最优、对噪声鲁棒性差的问题,故加入 AdaBoost 提高模型准确性和鲁棒性。两者结合能更好应对非线性和长期依赖的数据,提供更稳定的预测。项目还展示了如何在 MATLAB 中具体实现模型的各个环节。 适用人群:对时间序列预测感兴趣的开发者、研究人员及学生,特别是有一定 MATLAB 编程经验和熟悉深度学习或机器学习基础知识的人群。 使用场景及目标:①适用于金融市场价格预测、气象预报、工业生产故障检测等多种需要时间序列分析的场合;②帮助使用者理解并掌握将LSTM与AdaBoost结合的实现细节及其在提高预测精度和抗噪方面的优势。 其他说明:尽管该模型有诸多优点,但仍存在训练时间长、计算成本高等挑战。文中提及通过优化数据预处理、调整超参数等方式改进性能。同时给出了完整的MATLAB代码实现,便于学习与复现。
1996-2019年各地级市平均工资数据 1、时间:1996-2019年 2、来源:城市nj、各地级市统计j 3、指标:平均工资(在岗职工) 4、范围:295个地级市
AB PLC例程代码项目案例 【备注】 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用!有问题请及时沟通交流。 2、适用人群:计算机相关专业(如计科、信息安全、数据科学与大数据技术、人工智能、通信、物联网、自动化、电子信息等)在校学生、专业老师或者企业员工下载使用。 3、用途:项目具有较高的学习借鉴价值,不仅适用于小白学习入门进阶。也可作为毕设项目、课程设计、大作业、初期项目立项演示等。 4、如果基础还行,或热爱钻研,亦可在此项目代码基础上进行修改添加,实现其他不同功能。 欢迎下载!欢迎交流学习!不清楚的可以私信问我!
内容概要:本文介绍了一种新颖的变压器模型C2Former(Calibrated and Complementary Transformer),专门用于解决RGB图像和红外图像之间的物体检测难题。传统方法在进行多模态融合时面临两个主要问题——模态错位(Modality miscalibration)和融合不准确(fusion imprecision)。作者针对这两个问题提出采用互模交叉注意力模块(Inter-modality Cross-Attention, ICA)以及自适应特征采样模块(Adaptive Feature Sampling, AFS)来改善。具体来说,ICA可以获取对齐并且互补的特性,在特征层面进行更好的整合;而AFS则减少了计算成本。通过实验验证了基于C2Former的一阶段和二阶段检测器均能在现有公开数据集上达到最先进的表现。 适合人群:计算机视觉领域的研究人员和技术人员,特别是从事跨模态目标检测的研究人员,对Transformer架构有一定了解的开发者。 使用场景及目标:适用于需要将可见光和热成像传感器相结合的应用场合,例如全天候的视频监控系统、无人驾驶汽车、无人
上海人工智能实验室:金融大模型应用评测报告-摘要版2024.pdf
malpass_02_0907
C++-自制学习辅助工具
内容概要:本文提供了有关微信生态系统的综合开发指导,具体涵盖了微信机器人的Java与Python开发、全套及特定应用的小程序源码(PHP后台、DeepSeek集成),以及微信公众号的基础开发与智能集成方法。文中不仅给出了各种应用的具体案例和技术要点如图灵API对接、DeepSeek大模型接入等的简述,还指出了相关资源链接以便深度探究或直接获取源码进行开发。 适合人群:有意开发微信应用程序或提升相应技能的技术爱好者和专业人士。不论是初涉者寻求基本理解和操作流程,还是进阶者期望利用提供的资源进行项目构建或是研究。 使用场景及目标:开发者能够根据自身兴趣选择不同方向深入学习微信平台的应用创建,如社交自动化(机器人)、移动互联网服务交付(小程序),或者公众信息服务(公众号)。特别是想要尝试引入AI能力到应用中的人士,文中介绍的内容非常有价值。 其他说明:文中提及的多个项目都涉及到了最新技术栈(如DeepSeek大模型),并且为不同层次的学习者提供从零开始的详细资料。对于那些想要迅速获得成果同时深入了解背后原理的人来说是个很好的起点。
pimpinella_3cd_01_0916
mellitz_3cd_01_0516
schube_3cd_01_0118
AB PLC例程代码项目案例 【备注】 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用!有问题请及时沟通交流。 2、适用人群:计算机相关专业(如计科、信息安全、数据科学与大数据技术、人工智能、通信、物联网、自动化、电子信息等)在校学生、专业老师或者企业员工下载使用。 3、用途:项目具有较高的学习借鉴价值,不仅适用于小白学习入门进阶。也可作为毕设项目、课程设计、大作业、初期项目立项演示等。 4、如果基础还行,或热爱钻研,亦可在此项目代码基础上进行修改添加,实现其他不同功能。 欢迎下载!欢迎交流学习!不清楚的可以私信问我!
AB PLC例程代码项目案例 【备注】 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用!有问题请及时沟通交流。 2、适用人群:计算机相关专业(如计科、信息安全、数据科学与大数据技术、人工智能、通信、物联网、自动化、电子信息等)在校学生、专业老师或者企业员工下载使用。 3、用途:项目具有较高的学习借鉴价值,不仅适用于小白学习入门进阶。也可作为毕设项目、课程设计、大作业、初期项目立项演示等。 4、如果基础还行,或热爱钻研,亦可在此项目代码基础上进行修改添加,实现其他不同功能。 欢迎下载!欢迎交流学习!不清楚的可以私信问我!
AB PLC例程代码项目案例 【备注】 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用!有问题请及时沟通交流。 2、适用人群:计算机相关专业(如计科、信息安全、数据科学与大数据技术、人工智能、通信、物联网、自动化、电子信息等)在校学生、专业老师或者企业员工下载使用。 3、用途:项目具有较高的学习借鉴价值,不仅适用于小白学习入门进阶。也可作为毕设项目、课程设计、大作业、初期项目立项演示等。 4、如果基础还行,或热爱钻研,亦可在此项目代码基础上进行修改添加,实现其他不同功能。 欢迎下载!欢迎交流学习!不清楚的可以私信问我!
智慧用电平台建设解决方案【28页】
lusted_3ck_01_0519
HCIP作业1 这里面是完成的ensp的拓扑图
会员式点餐小程序1.2.1 前端 会员卡点餐小程序 适用于书吧、咖啡书屋、健身房等有会员卡充值需求的场所。 小程序专属会员模式,可享受折扣为余额充值,稳定客流。 版本号:1.2.1 适配一个php兼容性错误 修改消息通知模板