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:// 处理图片路径
        
    

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

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

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

看一下此时的效果

由于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 快捷)也就是分享,看下图

源码欢迎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 zhengsonglan001@gmail.com
 */

有任何问题请加个人微信

以上是关于1分钟让你的App 适配 锤子OneStep的主要内容,如果未能解决你的问题,请参考以下文章

flutter也能适配了!

子弹短信 app 安卓版正式上线

手机体验系列之三

如何让你的小游戏适配不同尺寸的手机屏幕

清单适配器和布局 让你的程序更优雅

30行js让你的rem弹性布局适配所有分辨率(含竖屏适配)