文档章节

Android更换头像弹框之createChooser

sizeof
 sizeof
发布于 2015/06/11 11:53
字数 993
阅读 57
收藏 0

先看看恶心的smali,简单分析了一下

.method public static takeOrChoosePhoto(Landroid/app/Activity;I)V
    .locals 14
    .param p0, "context"    # Landroid/app/Activity;
    .param p1, "requestCode"    # I


    .prologue
    .line 148
    sget-object v11, Lcn/zhimawu/utils/ImageUtils;->PHOTO_DIR:Ljava/io/File;


    invoke-virtual {v11}, Ljava/io/File;->mkdirs()Z


    .line 149
    new-instance v11, Ljava/io/File;


    sget-object v12, Lcn/zhimawu/utils/ImageUtils;->PHOTO_DIR:Ljava/io/File;


    invoke-static {}, Lcn/zhimawu/utils/ImageUtils;->getPhotoFileName()Ljava/lang/String;


    move-result-object v13


    invoke-direct {v11, v12, v13}, Ljava/io/File;-><init>(Ljava/io/File;Ljava/lang/String;)V


    sput-object v11, Lcn/zhimawu/utils/ImageUtils;->mCurrentPhotoFile:Ljava/io/File;


    .line 150
    sget-object v11, Lcn/zhimawu/utils/ImageUtils;->mCurrentPhotoFile:Ljava/io/File;


    invoke-static {v11}, Landroid/net/Uri;->fromFile(Ljava/io/File;)Landroid/net/Uri;


    move-result-object v7


    .line 152
    .local v7, "outputFileUri":Landroid/net/Uri;
    
    创建LIST V0 叫cameraIntents
    
    new-instance v0, Ljava/util/ArrayList;


    invoke-direct {v0}, Ljava/util/ArrayList;-><init>()V


    .line 153
    .local v0, "cameraIntents":Ljava/util/List;, "Ljava/util/List<Landroid/content/Intent;>;"
    
    创建V1 captureIntent
    
    new-instance v1, Landroid/content/Intent;


    const-string v11, "android.media.action.IMAGE_CAPTURE"


    初始化
    
    invoke-direct {v1, v11}, Landroid/content/Intent;-><init>(Ljava/lang/String;)V


    .line 154
    .local v1, "captureIntent":Landroid/content/Intent;
    
    p0 是这个takeOrChoosePhoto方法的参数 context
    
    invoke-virtual {p0}, Landroid/app/Activity;->getPackageManager()Landroid/content/pm/PackageManager;


    返回给V8
    move-result-object v8


    .line 155
    .local v8, "packageManager":Landroid/content/pm/PackageManager;
    const/4 v11, 0x0


    invoke-virtual {v8, v1, v11}, Landroid/content/pm/PackageManager;->queryIntentActivities(Landroid/content/Intent;I)Ljava/util/List;


    move-result-object v6


    .line 156
    .local v6, "listCam":Ljava/util/List;, "Ljava/util/List<Landroid/content/pm/ResolveInfo;>;"
    invoke-interface {v6}, Ljava/util/List;->iterator()Ljava/util/Iterator;


    move-result-object v4


    .local v4, "i$":Ljava/util/Iterator;
    :goto_0
    invoke-interface {v4}, Ljava/util/Iterator;->hasNext()Z


    move-result v11


    if-eqz v11, :cond_0


    invoke-interface {v4}, Ljava/util/Iterator;->next()Ljava/lang/Object;


    move-result-object v10


    check-cast v10, Landroid/content/pm/ResolveInfo;


    .line 157
    .local v10, "res":Landroid/content/pm/ResolveInfo;
    iget-object v11, v10, Landroid/content/pm/ResolveInfo;->activityInfo:Landroid/content/pm/ActivityInfo;


    iget-object v9, v11, Landroid/content/pm/ActivityInfo;->packageName:Ljava/lang/String;


    .line 158
    .local v9, "packageName":Ljava/lang/String;
    new-instance v5, Landroid/content/Intent;


    invoke-direct {v5, v1}, Landroid/content/Intent;-><init>(Landroid/content/Intent;)V


    .line 159
    .local v5, "intent":Landroid/content/Intent;
    new-instance v11, Landroid/content/ComponentName;


    iget-object v12, v10, Landroid/content/pm/ResolveInfo;->activityInfo:Landroid/content/pm/ActivityInfo;


    iget-object v12, v12, Landroid/content/pm/ActivityInfo;->packageName:Ljava/lang/String;


    iget-object v13, v10, Landroid/content/pm/ResolveInfo;->activityInfo:Landroid/content/pm/ActivityInfo;


    iget-object v13, v13, Landroid/content/pm/ActivityInfo;->name:Ljava/lang/String;


    invoke-direct {v11, v12, v13}, Landroid/content/ComponentName;-><init>(Ljava/lang/String;Ljava/lang/String;)V


    invoke-virtual {v5, v11}, Landroid/content/Intent;->setComponent(Landroid/content/ComponentName;)Landroid/content/Intent;


    .line 161
    invoke-virtual {v5, v9}, Landroid/content/Intent;->setPackage(Ljava/lang/String;)Landroid/content/Intent;


    .line 162
    const-string v11, "output"


    invoke-virtual {v5, v11, v7}, Landroid/content/Intent;->putExtra(Ljava/lang/String;Landroid/os/Parcelable;)Landroid/content/Intent;


    .line 163
    invoke-interface {v0, v5}, Ljava/util/List;->add(Ljava/lang/Object;)Z


    goto :goto_0


    .line 167
    .end local v5    # "intent":Landroid/content/Intent;
    .end local v9    # "packageName":Ljava/lang/String;
    .end local v10    # "res":Landroid/content/pm/ResolveInfo;
    :cond_0
    
    
    创建intent
    
    new-instance v3, Landroid/content/Intent;


    invoke-direct {v3}, Landroid/content/Intent;-><init>()V


    设置images/*,setType


    .line 168
    .local v3, "galleryIntent":Landroid/content/Intent;
    const-string v11, "image/*"


    invoke-virtual {v3, v11}, Landroid/content/Intent;->setType(Ljava/lang/String;)Landroid/content/Intent;


    设置ACTION为android.intent.action.GET_CONTENT


    .line 169
    const-string v11, "android.intent.action.GET_CONTENT"


    invoke-virtual {v3, v11}, Landroid/content/Intent;->setAction(Ljava/lang/String;)Landroid/content/Intent;


    创建createChooser


    .line 172
    const-string v11, "\u9009\u62e9\u7167\u7247" 这4个字符是选择照片


    invoke-static {v3, v11}, Landroid/content/Intent;->createChooser(Landroid/content/Intent;Ljava/lang/CharSequence;)Landroid/content/Intent;


    将结果返回给V2变量
    
    move-result-object v2
    
    
    
    设置createChooser的返回结果(Intent)的chooserIntent为android.intent.extra.INITIAL_INTENTS


    声明变量chooserIntent
    .line 175
    .local v2, "chooserIntent":Landroid/content/Intent;
    
    声明变量V12为字符串
    const-string v12, "android.intent.extra.INITIAL_INTENTS"


    invoke-interface {v0}, Ljava/util/List;->size()I


    move-result v11


    new-array v11, v11, [Landroid/os/Parcelable;


    invoke-interface {v0, v11}, Ljava/util/List;->toArray([Ljava/lang/Object;)[Ljava/lang/Object;


    move-result-object v11


    check-cast v11, [Landroid/os/Parcelable;


    v2.putExtra(v12,v11)


    invoke-virtual {v2, v12, v11}, Landroid/content/Intent;->putExtra(Ljava/lang/String;[Landroid/os/Parcelable;)Landroid/content/Intent;


    .line 178
    invoke-virtual {p0, v2, p1}, Landroid/app/Activity;->startActivityForResult(Landroid/content/Intent;I)V


    .line 179
    return-void
.end method


事实上当你进行打开相册的intent的时候可以有很多种选择,

//                        这个Intent是远古方法 直接进入相册里面选择了
//                        Intent intent = new Intent(Intent.ACTION_PICK, null);
//                        intent.setDataAndType(MediaStore.Images.Media.EXTERNAL_CONTENT_URI,"image/*");
//                        startActivityForResult(intent,1);



//                        这个Intent是弹出 选择要使用的应用(图库、文件管理、WPS等)
//                        Intent intent = new Intent(
//                                Intent.ACTION_GET_CONTENT);
//                        intent.addCategory(Intent.CATEGORY_OPENABLE);
//                        intent.setType("image/*");



这个也是直接进入相册中选择
//                        Intent intent = new Intent(Intent.ACTION_PICK);
//                        intent.setType("image/*");//相片类型



但是需要弹出个框子选择可以拍照、还可以图库、文件管理的,就需要这样了(我没按照原版smali代码):

Intent captureIntent = new Intent("android.media.action.IMAGE_CAPTURE");

                        Parcelable[] parcelables = new Parcelable[]{captureIntent};

                        Intent galleryIntent = new Intent(Intent.ACTION_GET_CONTENT);
                        galleryIntent.setType("image/*");
                        Intent chooserIntent = Intent.createChooser(galleryIntent, "选择照片");
                        chooserIntent.putExtra("android.intent.extra.INITIAL_INTENTS", parcelables);


                        startActivityForResult(chooserIntent, 1);



OK、测试机型是小米

© 著作权归作者所有

共有 人打赏支持
sizeof
粉丝 4
博文 18
码字总数 11300
作品 0
海淀
私信 提问
项目需求讨论 - WebView下拍照及图片选择功能

前言: 如果觉得掘金上看图片放大看不清楚,可以跳到另外的同步发布的链接看,放大图片下部有个可以查看原图功能,很清楚:项目需求讨论 - WebView下拍照及图片选择功能 现在很多app里面,都...

青蛙要fly
2018/06/23
0
0
OSCHINA Android 客户端 1.7.0 发布

OSChina.NET for Android v1.7.0 版本发布了,该版本主要更新内容: v1.7.0 更新日志: 1.默认加载数据均为缓存,新数据需用户手动刷新; 2.新增问答区帖子带标签的功能; 3.新增动弹发表评论...

迷途d书童
2012/09/04
1K
24
Android系统设置联系人头像教程

Android系统的手机是不支持编辑SIM卡上的联系人的,所以要设置联系人的头像也是没办法的,那么要怎么才能设置Android系统的联系人头像呢? 工具/原料 Android手机 方法/步骤 打开手机的联系人...

伊甸网
2013/04/08
0
0
Android listview

一:Android 弹软键盘时listview的变化控制: 问题描述:界面中有三部分,上面是标题栏,中间是Listview,下面是输入框。当点击输入框时,保持标题栏,挤压ListView。最终效果类似于微信聊天界...

当空皓月
2015/01/16
0
0
前端系列——与众不同的移动端底部固定栏 fixed、absolute 兼容 iOS 和 Android 方案

相信我,我分享的和你在其他博客上看到的终极方案是如此的与众不同! 做过移动端开发的同学,对底部DOM定位出现的各种奇葩情况已经深恶痛绝了吧,底部DOM设置不同的position,在Android和ios...

大灰狼的小绵羊哥哥
2018/09/13
0
0

没有更多内容

加载失败,请刷新页面

加载更多

徒手撸一个简单的RPC框架

徒手撸一个简单的RPC框架 之前在牛逼哄哄的 RPC 框架,底层到底什么原理得知了RPC(远程过程调用)简单来说就是调用远程的服务就像调用本地方法一样,其中用到的知识有序列化和反序列化、动态...

不学无数的程序员
31分钟前
1
0
Java 面试题目最全集合1000+ 大放送,能答对70%就去BATJTMD试试~

2019,相对往年我们会发现今年猎头电话少了,大部分企业年终奖缩水,加薪幅度也不如往年,选择好offer就要趁早,现在开始准备吧,刷一波Java面试题,能回答70%就去BATJTMD大胆试试~ 以下是2...

mikechen优知
36分钟前
2
0
玩转Koa之核心原理分析

Koa作为下一代Web开发框架,不仅让我们体验到了async/await语法带来同步方式书写异步代码的酸爽,而且本身简洁的特点,更加利于开发者结合业务本身进行扩展。 本文从以下几个方面解读Koa源码...

前端小攻略
38分钟前
1
0
分布式之数据库和缓存双写一致性方案解析

为什么写这篇文章? 首先,缓存由于其高并发和高性能的特性,已经在项目中被广泛使用。在读取缓存方面,大家没啥疑问,都是按照下图的流程来进行业务操作。 ![] 但是在更新缓存方面,对于更新...

hensemlee
今天
5
0
怎么学习大数据

最近有很多人在找,大数据是怎么学?需要学什么技术以及这些技术的学习顺序是什么?今天有时间我把个问题总结成文章分享给大家。 那大数据处理技术怎么学习呢?首先我们要学习Java语言和Lin...

董黎明
今天
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部