文档章节

Android更换头像弹框之createChooser

sizeof
 sizeof
发布于 2015/06/11 11:53
字数 993
阅读 46
收藏 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
06/23
0
0
Android系统设置联系人头像教程

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

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

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

当空皓月
2015/01/16
0
0
关于Android H5混合开发遇到的问题

添加WebChromeClient,复写onJsAlert、onJsConfirm、onJsPrompt方法后,弹框异常退出问题 项目经理说,Android没有处理弹框,点击按钮没有反应,iOS就可以。于是就复写了onJsAlert、onJsCon...

渊泉如渊
08/06
0
0
Genymotion与Oracle VM VirtualBox,搭建快速移动应用模拟环境

Genymotion Oracle VM VirtuailBox 这两软件自行百度,我也大概理解为是跟Eclipse上的ADT模拟机一样的环境,但比ADT快上NNNNNN倍,估计能跟上原机运行速度...[Oracle VM VirtuailBox]本来这个...

p2ng
2014/07/15
0
3

没有更多内容

加载失败,请刷新页面

加载更多

下一页

windbg学习记录

我开始熟练使用windbg是从帮助手册开始的,也就是.hh命令。 就像学习windows开发从msdn开始一样,微软的产品虽然不开源,但是文档做的是相当的好。然而那些开源的东西呢?开源的竞争力其实就...

simpower
16分钟前
0
0
学习scala的网站汇总

https://www.codacy.com/blog/how-to-learn-scala/

Littlebox
18分钟前
0
0
配置本地的cloud9开发环境

前言 说到在线IDE开发环境,cloud9是不能绕过的,cloud9支持很多语言,默认支持的就有Node.js,Python,Ruby,PHP,Go,更逆天的是,他还支持数据库,包括MySQL,MongoDB,Redis,SQLite。但...

Kefy
22分钟前
1
0
springcloud应用程序上下文层次结构

如果您从SpringApplication或SpringApplicationBuilder构建应用程序上下文,则将Bootstrap上下文添加为该上下文的父级。这是一个Spring的功能,即子上下文从其父进程继承属性源和配置文件,因...

itcloud
27分钟前
0
0
新程序员最爱的免费资源

简评:国外美女程序员推荐了她自己用过的一些免费资源,对新手比较友好的那种。 原作者 Ali Spittel,是个美女程序员,以下这些资源都是她自己试过的。以下「我」代表 Ali Spittel。 学 HTML...

极光推送
30分钟前
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部