1分钟让你的App 适配 锤子OneStep
Posted ZeroFlutter
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了1分钟让你的App 适配 锤子OneStep相关的知识,希望对你有一定的参考价值。
前言
发布会是从一半开始看的,但是我没错过两个东西 Big Bang 和 OneStep,这两个东西从技术角度实现并不是什么难事,只主要的就是龙哥的创意,让人佩服不已,佩服不已,佩服不已。
本文重点
如何实现OneStep
遇到content:// 的图片怎么处理
Uri 的构成
实现OneStep
首先我们先分析一下OneStep ,OneStep 实际上就是分享,包括文字和图片,只不过龙哥把他弄得更加简单炫酷了一点,分享其实安卓是提供了这样的接口的。
在
androidManifest.xml
中的activity
标签中添加如下代码
<!--接收文字-->
<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" />
<category android:name="android.intent.category.DEFAULT" />
<data android:mimeType="image/*" />
</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>
这个其实就是我们都知道的意图拦截器的配置,其中的意思就是 action: 行为是SEND/SEND_MULTIPLE nimeType: 接收类型
在onCreate中接收并处理数据。
Intent intent = getIntent();
String action = intent.getAction();
String type = intent.getType();
if (Intent.ACTION_SEND.equals(action) && type != null)
if ("text/plain".equals(type)) //文字
String sharedText = intent.getStringExtra(Intent.EXTRA_TEXT);
if (sharedText != null)
todo:// 处理文字
else if (type.startsWith("image/")) //单张图片和文字
String sharedText = intent.getStringExtra(Intent.EXTRA_TEXT);
if (sharedText != null)
todo:// 处理文字
Uri imageUri = intent.getParcelableExtra(Intent.EXTRA_STREAM);
todo:// 处理图片路径
else if (Intent.ACTION_SEND_MULTIPLE.equals(action) && type != null) //多张图片
if (type.startsWith("image/"))
ArrayList<Uri> imageUris = intent.getParcelableArrayListExtra(Intent.EXTRA_STREAM);
for (Uri uri : imageUris)
todo:// 处理图片路径
到这里就基本算是完事了,我们先看一下效果
这里为什么没有这个App的Icon呢,说好的分享呢?其实除了系统应用和微信 社交应用默认是开启的之外,其他app是关闭的,需要开启一下,看到那个锤子便签上面的那个设置按钮了吗?点击一下看到如下图(这是锤子截屏,设置中添加的外壳),打开开关就可以了
看一下此时的效果
小结
到这里我们的OneStep 已经实现了,其实就是Google 的分享接口,我们首先需要在AndroidManifest
中的activity中添加意图拦截器,然后再对应的Activity 去处理接收的数据。
content:// Uri path的处理
如果你是从相册分享的图片,有时候会遇到Uri的path是一个’content://’ 而不是’file://’ ,这就是我们通常所说的ContentProvider(内容提供者) ,这个时候加入我们需要实现发朋友圈的功能,你就需要处理后,new 出一个File 然后吧啦吧啦一大堆,传给服务器啦,这块就是我们需要处理的一个细节,所以就不多说了,上代码了,看不懂的直接留言回复就ok。
/**
* url转为FilePath
*
* @param imageUri Uri
* @return 返回最终文件的实际路径
*/
private String UriToFilePath(Uri imageUri)
if (imageUri != null)
String imagePath = imageUri.getPath();
if (ContentResolver.SCHEME_CONTENT.equals(imageUri.getScheme()))
imagePath = getStringPathFromURI(this, imageUri);
return imagePath;
return null;
/**
* 从ContentResolver 中或得到文件的实际地址
*
* @param context 上下文
* @param contentUri Uri
* @return 返回最终文件的实际路径
*/
public String getStringPathFromURI(Context context, Uri contentUri)
Cursor cursor = null;
try
String[] proj = MediaStore.Images.Media.DATA;
cursor = context.getContentResolver().query(contentUri, proj, null, null, null);
if (cursor != null)
int column_index = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
cursor.moveToFirst();
return cursor.getString(column_index);
finally
if (cursor != null)
cursor.close();
return null;
Uri 的结构
这里也不多说,应为相关的文章和官方的介绍都非常的详细了,贴别提醒大家,我们在new Intent
后,我们拿到Intent对象直接setData()
或者getData()
的时候就是Uri
[scheme:]scheme-specific-part[#fragment]
[scheme:][//authority][path][?query][#fragment]
[scheme:][//host:port][path][?query][#fragment]
在拿到Uri的时候我们可以使用 getPath()
拿到传过来的路径,使用getScheme()
Uri的类型,是file://
还是content://
判断一下然后做处理就可以了。
其他手机也是支持的(只是OneStep 快捷)也就是分享,看下图
相关文章
https://developer.android.com/training/sharing/index.html
https://developer.android.com/reference/java/net/URI.html
/**
* --------------
* 欢迎转载 | 转载请注明
* --------------
* 如果对你有帮助,请点击|顶|
* --------------
* 请保持谦逊 | 你会走的更远
* --------------
* @author zsl
* @github https://github.com/yy1300326388
* @blog http://blog.csdn.net/yy1300326388
* @email zhengsonglan001@gmail.com
*/
有任何问题请加个人微信
以上是关于1分钟让你的App 适配 锤子OneStep的主要内容,如果未能解决你的问题,请参考以下文章