构建一个能够接收别的App数据的APP
2016-06-16 00:55
537 查看
我们都知道每个Android手机上都有图库,图库中的图片可以发送给别的APP进行显示,比如发送给微信好友、发送到朋友圈以及发送给电脑等(这个经常使用)。那这是怎么实现的呢,我们能不能自己构建一个APP,当在图库中点击发送的时候能够从可选项中找到我们的APP,然后在APP当中显示图片。这是可以的,而且非常简单。
在两个应用之间发送和接收数据最普遍的方式就是使用intent。Inetnt允许用户快速以及简单的共享数据。
怎么通过Intent给别的APP发送数据
往别的APP发送文字:
1、即使用户之前已经为这个intent选择了一个默认的动作,chooser依然会弹出
2、如果没有应用匹配这个动作,将弹出一个系统消息
3、你可以为这个选择对话框制定一个标题
代码如下所示:
往别的APP发送二进制内容:
二进制数据通过使用ACTION_SEND动作结合合适的MIME类型以及把指向要发送数据的URI放到一个叫做EXTRA_STREAM的extra当中,从而进行分享。这种方式通常用来共享图片,当然也可以共享任何类型的二进制内容。如下代码发送一张jpeg格式的图片:
接收的APP需要有读取这个URI的权限,推荐的方法是把URI指向的数据保存到ContentProvider或者MediaStore当中。
往别的APP发送多个内容:
如果要想共享多块内容,使用ACTION_SEND_MULTIPLE动作以及结合一系列指向内容的URLs。这个MIME类型根据你要共享的内容的不同而不同。例如,如果你共享三张JPEG图像,类型还是“image/jpeg”,对于一个混合的图像类型,应该使用"image/*"来匹配能够处理任何图像类型的activity。你应该使用“*/*”如果你想要共享类型比较宽泛的数据。
以上讲了怎么通过Intent给别的APP发送内容。既然图库可以发送图片,那么肯定是执行了ACTION_SEND(发送单张)或者ACTION_SEND_MULTIPLE操作(发送多张),下面来验证一下!
构建自己的APP
首先要想在图库中点击发送的时候,系统能够发现我们的APP。需要在我们开发的APP的Manifest文件当中给需要接收图片的Activity增加Intent filters,如下所示,代表ShareActivity能够处理文本、单张图片以及多张图片:
ShareActivity的oncreate如下所示,通过getIntent()得到Intent,然后得到相应的Action和type,然后执行相应的操作,这里使用了ImageLoader进行图片的显示,因为它会自动根据ImageView的大小进行图片的压缩以便于显示。
处理文本:
处理单张图片:
处理多张图片:
初始化ImageLoader:
下面来看一下效果:
如上图所示,当点击图片的发送按钮的时候,出现了我们自己的APP,当点击APP的时候,跳转到如下界面:
![](http://img.blog.csdn.net/20160616005004918?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
从上图可以看出:Action、type以及data完全符合预期,且接收到的图片显示了出来。
当我们发送多张图片给我们的APP的时候,界面如下,也是符合预期的!
在两个应用之间发送和接收数据最普遍的方式就是使用intent。Inetnt允许用户快速以及简单的共享数据。
怎么通过Intent给别的APP发送数据
往别的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);当然我们知道,可以通过调用Intent.createChooser函数,把intent传给他,将返回一个总是显示选择对话框的intent,这样做有诸多好处:
1、即使用户之前已经为这个intent选择了一个默认的动作,chooser依然会弹出
2、如果没有应用匹配这个动作,将弹出一个系统消息
3、你可以为这个选择对话框制定一个标题
代码如下所示:
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)));
往别的APP发送二进制内容:
二进制数据通过使用ACTION_SEND动作结合合适的MIME类型以及把指向要发送数据的URI放到一个叫做EXTRA_STREAM的extra当中,从而进行分享。这种方式通常用来共享图片,当然也可以共享任何类型的二进制内容。如下代码发送一张jpeg格式的图片:
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)));
接收的APP需要有读取这个URI的权限,推荐的方法是把URI指向的数据保存到ContentProvider或者MediaStore当中。
往别的APP发送多个内容:
如果要想共享多块内容,使用ACTION_SEND_MULTIPLE动作以及结合一系列指向内容的URLs。这个MIME类型根据你要共享的内容的不同而不同。例如,如果你共享三张JPEG图像,类型还是“image/jpeg”,对于一个混合的图像类型,应该使用"image/*"来匹配能够处理任何图像类型的activity。你应该使用“*/*”如果你想要共享类型比较宽泛的数据。
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.."));
以上讲了怎么通过Intent给别的APP发送内容。既然图库可以发送图片,那么肯定是执行了ACTION_SEND(发送单张)或者ACTION_SEND_MULTIPLE操作(发送多张),下面来验证一下!
构建自己的APP
首先要想在图库中点击发送的时候,系统能够发现我们的APP。需要在我们开发的APP的Manifest文件当中给需要接收图片的Activity增加Intent filters,如下所示,代表ShareActivity能够处理文本、单张图片以及多张图片:
<!-- 接收分享数据的Activity--> <activity android:name=".ShareActivity"> <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>这样当我们把这个APP安装到手机上面。点击图库中图片的发送,系统就会发现我们的APP,然后就能够发送图片给我们的APP。因此,我们必须在系统启动以上ShareActivity的时候根据Action进行相应的处理,得到图片的URI,然后显示出来。
ShareActivity的oncreate如下所示,通过getIntent()得到Intent,然后得到相应的Action和type,然后执行相应的操作,这里使用了ImageLoader进行图片的显示,因为它会自动根据ImageView的大小进行图片的压缩以便于显示。
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_share); initViews(); initImageLoader(this);//初始化IamgeLoader Intent intent = getIntent(); String action = intent.getAction(); String type = intent.getType(); tv_display.setText("Action: " + action + "\r\n" + "Type: " + type + "\r\n"); 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 { // 手动启动 } }
处理文本:
/** * 处理文本 * * @param intent */ void handleSendText(Intent intent) { String sharedText = intent.getStringExtra(Intent.EXTRA_TEXT); if (sharedText != null) { tv_display.append("SharedText:" + sharedText); } }
处理单张图片:
/** * 处理单张图片 * * @param intent */ void handleSendImage(Intent intent) { Uri imageUri = (Uri) intent.getParcelableExtra(Intent.EXTRA_STREAM); tv_display.append("ImageUri:" + imageUri.toString()); ImageLoader.getInstance().displayImage(imageUri.toString(), iv_display); }
处理多张图片:
/** * 处理多张图片 * * @param intent */ void handleSendMultipleImages(Intent intent) { ArrayList<Uri> imageUris = intent.getParcelableArrayListExtra(Intent.EXTRA_STREAM); if (imageUris != null) { tv_display.append("ImageUri:" + imageUris.toString()); //把图片显示到GridView } }
初始化ImageLoader:
/** * 初始化ImageLoader * * @param context */ public static void initImageLoader(Context context) { DisplayImageOptions defaultOptions = new DisplayImageOptions.Builder() // .showImageForEmptyUri(R.mipmap.ic_launcher) // .showImageOnFail(R.mipmap.ic_launcher) // .cacheInMemory(true) // .cacheOnDisk(true) // .build();// ImageLoaderConfiguration config = new ImageLoaderConfiguration// .Builder(context)// .defaultDisplayImageOptions(defaultOptions)// .discCacheSize(50 * 1024 * 1024)// .discCacheFileCount(100)// 缓存一百张图片 .writeDebugLogs()// .build();// ImageLoader.getInstance().init(config); }
下面来看一下效果:
如上图所示,当点击图片的发送按钮的时候,出现了我们自己的APP,当点击APP的时候,跳转到如下界面:
从上图可以看出:Action、type以及data完全符合预期,且接收到的图片显示了出来。
当我们发送多张图片给我们的APP的时候,界面如下,也是符合预期的!
相关文章推荐
- Android软键盘自动显示,手动控制显示与隐藏
- iOS之QuarzCore框架介绍
- Android开发笔记(八十五)手机数据库Realm
- android中使用GoogleMap的地理位置服务
- 微信创建自定义目录
- Android属性动画设置中心点
- 撕衣服
- 微信验证所有者
- ios学习路线—Objective-C(Block)
- Android知识点总结
- Android性能优化之内存优化
- 微信支付密码为什么是六位数?
- 微信称将严厉整顿微信群红包赌博行为:已限制8000涉赌群
- 8个实用排版技巧,让微信颜值美出新高度!
- 微信打飞机子弹运动轨迹调整
- 自定义曲线图
- iOS音频数据读取--AVAssetReader和音频波形图绘制
- Objective-C --- - UICollectionView (梳理总结)
- 微信支付PHP SDK —— 公众号支付代码详解
- 【Demo】微信上墙