首页 文章 精选 留言 我的

精选列表

搜索[android studio],共10000篇文章
优秀的个人博客,低调大师

SAE Storage + Android微信内置浏览器图片上传解决方案

发现需求 最近在做一个项目,需要在微信里打开的网页中实现上传,IOS通过简单的上传插件可轻松搞定,但无论是FLASH+PHP还是JS+PHP,安卓平台微信内置浏览器始终无法上传文件。百度谷歌,均没有解决方案,参看很多公众平台的解决方案,多为推荐安卓用户跳到外部浏览器打开网页,但是这样体验不太好,于是着手自己去解决这个问题!再后来,听朋友说微信微社区可正常上传图片,于是去研究其上传代码,研究发现:微社区在客户端用了一套比较高端的JS框架,该框架将图片进行data:image/jpg;base64编码并ajax的方式传输到服务端,并返回图片的photoid等相关信息。服务器端我是看不到处理的细节,不过大概了解,无非就是对图片进行存储和数据库插入等操作。于是copy下该上传方式的前端代码。再结合SAE Storage的相关API写了一个上传处理的php文件,就很快解决了这个问题,效果不错,部分低端部分手机有闪退现象,这个微社区也存在这种问题。魅族,三星等主流机型均完美上传,现在来和大家分享分享。解决方案1.SAE StorageStorage -> 新建domain并命名为 imagefile,直接点击创建。2.找到Storage的API http://apidoc.sinaapp.com/sae/SaeStorage.html upload(line 291) 将文件上传入存储 注意:文件名左侧所有的'/'都会被过滤掉。 return:写入成功时返回该文件的下载地址,否则返回false author:Elmer Zhang access:public stringupload(string$domain,string$destFileName,string$srcFileName, [array$attr= array()], [bool$compress= false]) string$domain: 存储域,在在线管理平台.storage页面可进行管理 string$destFileName: 目标文件名 string$srcFileName: 源文件名 array$attr: 文件属性,可设置的属性请参考 SaeStorage::setFileAttr() 方法 bool$compress: 是否gzip压缩。如果设为true,则文件会经过gzip压缩后再存入Storage,常与$attr=array('encoding'=>'gzip')联合使用 write(line 251) 将数据写入存储 注意:文件名左侧所有的'/'都会被过滤掉。 return:写入成功时返回该文件的下载地址,否则返回false author:Elmer Zhang access:public stringwrite(string$domain,string$destFileName,string$content, [int$size= -1], [array$attr= array()], [bool$compress= false]) string$domain: 存储域,在在线管理平台.storage页面可进行管理 string$destFileName: 文件名 string$content: 文件内容,支持二进制数据 int$size: 写入长度,默认为不限制 array$attr: 文件属性,可设置的属性请参考 SaeStorage::setFileAttr() 方法 bool$compress: 是否gzip压缩。如果设为true,则文件会经过gzip压缩后再存入Storage,常与$attr=array('encoding'=>'gzip')联合使用 这里有两个函数可用,一个是upload,另一个是write,经实测,用upload直接处理编码过的图片会报错,应该需要先用PHP中的 base64_decode()函数解码再用write函数写入sae storage上刚才新建的imagefile里。 3.服务器端的处理代码如下: PHP代码 <?php //感谢@韩文博1学长的代码精炼建议 $ex=explode(",",$_POST['pic']);//分割data-url数据 $filter=explode('/', trim($ex[0],';base64'));//获取文件类型 $s=base64_decode(str_replace($filter[1] ,'',$ex[1]));//图片解码 $picname=date("YmdHis") . rand(100, 999) .'.'.$filter[1];//生成随机文件名 $s=newSaeStorage();//实例化SeaStorage类 $photo_id=$s->write("imagefile",$picname,$ss);//把解码后的图片写入创建的imagefile里,成功返回图片的url if($photo_id){//返回json数据到浏览器端 $status='success'; $errCode='0'; $arr=array( 'photo_id'=>$photo_id, 'status'=>$status, 'errCode'=>$errCode); echojson_encode($arr); } ?> 4.前端上传代码登录微社区,找到发帖功能,自行chrome工具下载前端代码。修改相应的服务器端响应文件(见图中选取的部分)5.拓展阅读Data URL是在本地直接绘制图片,不是从服务器加载,所以节省了HTTP连接,起到加速网页的作用。语法:data:image/jpg; 声明数据协议及类型名称base64, 编码形式为base64/9j/4AAQSkZ…… base64编码结果附上Data URL的生成方法(PHP): PHP代码 <?php $img_file=file_get_contents("http://tieba.baidu.com/tb/static-common/img/dimensionCode/tb_common_2dbc.jpg"); echobase64_encode($img_file); ?> 用这种方法会加重客户端的CPU和内存负担,总之有利有弊。 针对于一些小的数据,可以在网页中直接嵌入,而不是从外部文件载入,比如图片。这样的好处是可以减少一次http的请求,缺点是使得页面内容变大。data类型的url格式在98年就已经提出了,现在绝大部分的浏览器都能支持,比如使用IE6内核的国内浏览器,chrome和firefox等,实测安卓和ios上的微信浏览器均兼容此方案。大家有什么疑问,微博私信我http://weibo.com/itjaye 本文转自ljianbing51CTO博客,原文链接: http://blog.51cto.com/ljianbing/1607026 ,如需转载请自行联系原作者

优秀的个人博客,低调大师

[Android]在Adapter的getView方法中绑定OnClickListener比较好的方法

以下内容为原创,欢迎转载,转载请注明 来自天天博客:http://www.cnblogs.com/tiantianbyconan/p/4146512.html 给ListView中每个item绑定点击事件的方法,比较常见的如下这种方式: 1 public View getView(int positon, View convertView, ViewGroup parent){ 2 if(null == convertView){ 3 convertView = LayoutInflater.from(context).inflate(R.layout.item, null); 4 } 5 6 Button button = ABViewUtil.obtainView(convertView, R.id.item_btn); 7 button.setOnClickListener(new View.OnClickListener(){ 8 @Override 9 public void onClick(View v){ 10 Toast.makeText(context, "position: " + position, Toast.LENGTH_SHORT).show(); 11 } 12 }); 13 14 } 然后运行,当然没问题。 但是这里有一个可以优化的地方,注意代码第7行,每次调用getView方法都会设置Button的OnClickListener,会生成很多不必要的OnClickListener对象。 所以,我们可以想到,在生成convertView时,同时设置Button的OnClickListener,convertView是被不断地复用的,这样的OnClickListener也就可以被不断地服用,也就是说在第3行和第4行之间进行这一步。这样,代码演化到如下: 1 public View getView(int positon, View convertView, ViewGroup parent){ 2 if(null == convertView){ 3 convertView = LayoutInflater.from(context).inflate(R.layout.item, null); 4 Button button = ABViewUtil.obtainView(convertView, R.id.item_btn); 5 button.setOnClickListener(new View.OnClickListener(){ 6 @Override 7 public void onClick(View v){ 8 Toast.makeText(context, "position: " + position, Toast.LENGTH_SHORT).show(); 9 } 10 }); 11 } 12 } 这个代码看上去没什么问题,但是问题就在onClick回调的的第8行中使用的position的时候,因为这里使用的是匿名内部类(这个匿名内部类实现了View.OnClickListener这个接口),所以如果需要在onClick中使用position这个变量的话,需要把position声明为final。一旦声明了final,等到编译之后,这个position就会被作为这个匿名内部类中的一个private的成员变量。这样,ListView往下滚动,下面需要显示的item会重用上面不显示的convertView,convertView中的Button设置的OnClickListener实现类的对象,回调onClick时,使用的position其实是该OnClickListener实现类的成员变量position(这个position的值只是在构造的时候被初始化了而已!)。所以,这个ListView刚加载完数据后,还未滚动时,点击屏幕上的item都是正常的,但是如果一旦滚动,有view被重用了,这个时候,position的值就错乱了,所以在onClick中通过position获取到的item的数据当然也是错乱的了。 所以,要解决这个问题,就需要让onClick方法回调的时候得到的position是个正确的值,我们可以选择使用把当前显示的convertView对应的position值保存在convertView中,然后把这个convertView对象传入OnClickListener中保存,所以代码演化到如下: 1 public View getView(int positon, View convertView, ViewGroup parent){ 2 if(null == convertView){ 3 convertView = LayoutInflater.from(context).inflate(R.layout.item, null); 4 Button button = ABViewUtil.obtainView(convertView, R.id.item_btn); 5 button.setOnClickListener(new OnConvertViewClickListener(convertView, R.id.ab__id_adapter_item_position){ 6 @Override 7 public void onClickCallBack(View registedView, int... positionIds){ 8 Toast.makeText(context, "position: " + positionIds[0], Toast.LENGTH_SHORT).show(); 9 } 10 }); 11 } 12 convertView.setTag(R.id.ab__id_adapter_item_position, position); 13 } 就像上面第5行这样,Button绑定的是OnConvertViewClickListener,它是OnClickListener的一个实现类可以保存convertView到Listener中,到时候回调onClick方法的时候可以从保存的convertView中获取到当前显示的item的position(这个position是以tag的方式保存在convertView中的)。 当然,还需要做第12行这一步,它的目的是把当前显示的position保存到convertView中,提供给OnConvertViewClickListener获取当前的position。 这样就ok了,可以在onClickCallBack()方法中进行点击事件的处理了,每个button永远只有一个onClickListener。 注:使用OnConvertViewClickListener可以依赖AndroidBucket(https://github.com/wangjiegulu/AndroidBucket)项目 本文转自天天_byconan博客园博客,原文链接:http://www.cnblogs.com/tiantianbyconan/p/4146512.html ,如需转载请自行联系原作者

资源下载

更多资源
Mario

Mario

马里奥是站在游戏界顶峰的超人气多面角色。马里奥靠吃蘑菇成长,特征是大鼻子、头戴帽子、身穿背带裤,还留着胡子。与他的双胞胎兄弟路易基一起,长年担任任天堂的招牌角色。

腾讯云软件源

腾讯云软件源

为解决软件依赖安装时官方源访问速度慢的问题,腾讯云为一些软件搭建了缓存服务。您可以通过使用腾讯云软件源站来提升依赖包的安装速度。为了方便用户自由搭建服务架构,目前腾讯云软件源站支持公网访问和内网访问。

Nacos

Nacos

Nacos /nɑ:kəʊs/ 是 Dynamic Naming and Configuration Service 的首字母简称,一个易于构建 AI Agent 应用的动态服务发现、配置管理和AI智能体管理平台。Nacos 致力于帮助您发现、配置和管理微服务及AI智能体应用。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据、流量管理。Nacos 帮助您更敏捷和容易地构建、交付和管理微服务平台。

WebStorm

WebStorm

WebStorm 是jetbrains公司旗下一款JavaScript 开发工具。目前已经被广大中国JS开发者誉为“Web前端开发神器”、“最强大的HTML5编辑器”、“最智能的JavaScript IDE”等。与IntelliJ IDEA同源,继承了IntelliJ IDEA强大的JS部分的功能。

用户登录
用户注册