1分钟让你的App 适配 锤子OneStep

前言

发布会是从一半开始看的,但是我没错过两个东西 Big Bang 和 OneStep,这两个东西从技术角度实现并不是什么难事,只主要的就是龙哥的创意,让人佩服不已,佩服不已,佩服不已。

本文重点

  • 如何实现OneStep
  • 遇到content:// 的图片怎么处理
  • Uri 的构成

实现OneStep

首先我们先分析一下OneStep ,OneStep 实际上就是分享,包括文字和图片,只不过龙哥把他弄得更加简单炫酷了一点,分享其实安卓是提供了这样的接口的。

AndroidManifest.xml中的activity标签中添加如下代码



    "android.intent.action.SEND" />
    "android.intent.category.DEFAULT" />
    "text/plain" />



    "android.intent.action.SEND" />
    "android.intent.category.DEFAULT" />
    "image/*" />



    "android.intent.action.SEND_MULTIPLE" />
    "android.intent.category.DEFAULT" />
    "image/*" />

1分钟让你的App 适配 锤子OneStep_第1张图片

这个其实就是我们都知道的意图拦截器的配置,其中的意思就是 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 imageUris = intent.getParcelableArrayListExtra(Intent.EXTRA_STREAM);
        for (Uri uri : imageUris) {
            todo:// 处理图片路径
        }
    }
}

1分钟让你的App 适配 锤子OneStep_第2张图片

到这里就基本算是完事了,我们先看一下效果

由于Gif图片太大点击这里查看

这里为什么没有这个App的Icon呢,说好的分享呢?其实除了系统应用和微信 社交应用默认是开启的之外,其他app是关闭的,需要开启一下,看到那个锤子便签上面的那个设置按钮了吗?点击一下看到如下图(这是锤子截屏,设置中添加的外壳),打开开关就可以了

1分钟让你的App 适配 锤子OneStep_第3张图片

看一下此时的效果

由于Gif图片太大点击这里查看

小结

到这里我们的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 快捷)也就是分享,看下图

1分钟让你的App 适配 锤子OneStep_第4张图片

源码欢迎Star

相关文章

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 [email protected]
 */

有任何问题请加个人微信
1分钟让你的App 适配 锤子OneStep_第5张图片

你可能感兴趣的:(Android,Framework)