精华内容
下载资源
问答
  • charles现在好像不能用安卓虚拟机抓包了 求问大佬们有什么解决方案
  • 主要介绍了Vue-cli3 项目在安卓版本系统和 IE 上白屏问题解决,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
  • 安卓版本进化史

    2019-07-16 15:41:00
    “就像你问我怎么才能造坦克,我就必须把从冶金到化工整个现代化...从2009年5月开始,Android操作系统改用甜点来作为版本代号,这些版本按照从C大写字母开始的顺序来进行命名:纸杯蛋糕(Cupcake)、甜甜圈(Donut)...

    “就像你问我怎么才能造坦克,我就必须把从冶金到化工整个现代化工业体系给你讲一遍。”——tombkeeper

     

    Android已经是一个完全成熟的操作系统,它已经不仅仅用在智能手机,现在也可以用在平板电脑、电视播放器和其他设备上。

    从2009年5月开始,Android操作系统改用甜点来作为版本代号,这些版本按照从C大写字母开始的顺序来进行命名:纸杯蛋糕(Cupcake)、甜甜圈(Donut)、闪电泡芙(Éclair)、冻酸奶(Froyo)、姜饼(Gingerbread)、蜂巢(Honeycomb)﹑冰淇淋三明治(Ice Cream Sandwich)、果冻豆(Jelly Bean)、奇巧(KitKat)、棒棒糖(Lollipop)、棉花糖(Marshmallow)、牛轧糖(Nougat)、奥利奥(Oreo),此外,Android操作系统还有两个预发布的内部版本,它们分别是原子小金刚(Astro)和机器人班亭(Bender,电视动画《飞出个未来》角色)。

     

    安卓 1.0(2008年)
    安卓系统于2008年正式上市,搭载安卓1.0,还没有像以后每个版本一样的可爱的代号。安卓1.0在HTC梦想(又称T-MobileG1,这是全球首部搭载Android的智能手机)上首次亮相。早期的谷歌应用程序,如Gmail、地图、日历和YouTube,都集成到了安卓操作系统中。

    安卓 1.5 Cupcake “杯型蛋糕”(2009年)
    Android 1.5 Cupcake于2009年4月30日发布,给安卓版本名称的传统“甜点项目”诞生了。作为安卓的第一次主要更新,Cupcake为Android界面引入了许多改进,包括第一个屏幕键盘,使得手机远离了曾经无处不在的物理键盘。Cupcke还推出了第三方应用程序小部件的框架,很快成为Android最具特色的元素之一。

    安卓 1.6 Donut “甜甜圈” (2009年)
    Android 1.6 Donut 在2009年秋季9月15日进入世界。Donut提供了改进的搜索功能,填补了安卓中心的一些重要的漏洞,提供了操作系统在不同屏幕尺寸和分辨率下运行的能力。还增加了对像Verizon这样的CDMA网络的支持,这将在Android即将爆发的技术爆炸种发挥关键作用。

    安卓 2.0 Eclair “埃克拉”(2009年)
    Android 2.0代号为Eclair,于2009年10月26日发布,仅仅是“甜甜圈”发布后的6周,Android早年发布的速度确实惊人。“Eclair”是第一个进入主流意识的Android版本,该版本最具变革性的元素是增加了语音导向的导航和实时交通信息,这是在以前智能手机领域闻所未闻的东西。除了导航,“Eclair”还为Android提供了实时壁纸,以及平台的第一个语音到文本转换的功能。

    安卓 2.2 Froyo “弗洛约” (2010年)
    Android 2.2 Froyo于2010年5月20日发布,Froyo允许Android用户使用语音输入和搜索来控制他们的手机而不用触摸它们。并可以在存储卡上安装应用,这是一个巨大的改变,因为大多数手机的存储空间不足4至8GB。

    安卓 2.3 Gingerbread “姜饼” (2011年)
    Android 2.3 Gingerbread 具有第一个真正的视觉识别系统。有了Gingerbread,全世界都知道了近场通信(NFC),它允许电话与附近的其他设备连接,还增加了陀螺仪和气压计支持。Gingerbread还允许使用前置摄像头进行视频通话,并添加了一个下载管理器。

    安卓 3.0/3.1/3.2 Honeycomb “蜂巢”(2011年)
    Android 3.0 Honeycomb于2011年2月22日发布。Honeycomb在Android历史上脱颖而出,成为专为平板电脑开发的唯一版本。像虚拟键盘这样的界面元素已针对更大的屏幕进行了优化,并且已经支持多核处理器,这很快成为了常态。Honeycomb功能包括3D图形支持、并排的浏览器选项卡、与Google Talk的视频聊天、蓝牙连接和照片库中的全屏模式。Honeycomb是新旧之间的桥梁。

    安卓 4.0 Ice Cream Sandwich “冰淇淋三明治”(2011年)
    Android 4.0 冰淇淋于2011年10月19日发布,正式进入现代设计时代。该版本改进了蜂巢式和统一式平板电脑,同时引入了手机视觉概念。该系统增加了解锁手机的人脸识别、拒绝通话的屏蔽文本响应和摄像头中的实时视频效果。Android4.0带来了一个标准化的设计框架,被称为“霍洛”(Holo)。

    安卓 4.1 Jelly Bean “果冻豆”(2012年)
    Android 4.1 Jelly Bean于2012年6月27日在谷歌Goole I/O会议上宣布。这款Android 4.1 Jelly Bean于2012年7月9日发布到Android开源项目中。Jelly Bean为我们提供了可扩展的交互式通知、扩展的语音搜索系统和更先进的显示搜索结果的系统。多用户支持也开始发挥作用。并且首次亮相早期版本的Android快速设置面板。Jelly Bean具有更快、更平滑的性能。它可以让用户于可扩展的通知进行更多的交互,Chrome浏览器成为默认浏览器,小部件也可以调整大小。

    安卓 4.4 KitKat “奇巧”(2013年)
    Android 4.4 KitKat于2013年9月3日由Goole发布。这款Android 4.4经过优化,可运行在各种智能手机上,即使最老的拥有512兆内存的Android版本。它引入了用于启动Google助手的“OK Goole”语音命令,以及更好的消息管理,Emoji支持和改进的多任务处理。2013年奇巧的发布标志着Android黑暗时代的结束,“姜饼”的黑色和“蜂巢”的蓝色最终走出了操作系统。更轻的背景和更中性的高光取代了他们的位置,透明的状态栏和白色的图标给操作系统一个更现代的外观。

    安卓 5.0/5.1 Lollipop “棒棒糖”(2014年)
    Android 5.0 Lollipop于2014年11月12日发布。谷歌用一个叫做“Material Design”的平面界面彻底颠覆了Lollipop的美学。通知以横幅的形式出现在锁定屏幕上或作为弹出警告。Lollipop在Android中引入了一系列新功能,包括通过“OK,Google”实现真正的免提语音控制。支持电话上的多个用户,以及更好地通知管理的优先级模式。不幸的是,它的变化如此之大,以至于它也引入了一些bug,其中许多问题直到5.1版本才完全解决。

    安卓 6.0 Marshmallow “棉花糖”(2015年)
    Android 6.0 Marshmallow于2015年5月28日在Google I/O期间发布。Marshmallow引入了睡眠模式以节省电池寿命,而且还增加了对指纹阅读器、USB类型C和4K模式应用程序的内置支持。Marshmallow最引人注目的元素是一个叫做Now on Tap的屏幕搜索功能。

    安卓 7.0 Nougat “牛轧糖”(2016年)
    Nougat提供了原生分屏模式以及一个数据库保护程序功能,并可以用一个简单的点击就可以彻底清除所有的应用程序。在Nougat的改进中,最关键的可能是谷歌助手,谷歌助手将成为Android和大多数其他谷歌产品的关键组成部分。

    安卓 8.0 Oreo “奥利奥”(2017年)
    2017年8月21日,Goole发布了Android 8.0的名称,是Oreo。通知功能再次得到改善, 同时您也可以期待画中画视频模式, 这使你可以在可调整大小的框中观看YouTube剪辑,同时还可以使用其他应用。 谷歌已经对音频质量和文本输入以及资源管理等方面做了大量改进。

    安卓 9.0 Pie “派”(2018年)
    Pie专注于幕后改进,使安卓手机工作更快,节省电池寿命。同时通过人工智能工具建议用户增加可能要使用的应用程序和快捷方式,并提供精确信息的在线页面进行应用搜索。Pie推出了一种新的手势驱动系统,还有通用建议恢复系统、更有效的屏幕截图管理方法以及更智能的电源管理和屏幕亮度控制系统。

    安卓 10.0 Q(2019年)
    安卓Q将支持可折叠设备,并优化人工智能技术,使得新系统中的神经网络识别完全可以在离线模式下进行。而且增加了用户期待的黑暗模式,同时进一步优化增加用户安全问题。

    转载于:https://www.cnblogs.com/Fingerprint/p/11195288.html

    展开全文
  • 安卓版本更新的逻辑

    2016-09-19 18:01:11
    对于安卓版本更新,相信很多人都不会陌生,它主要包括强制更新和正常提示更新,现在就对于这方面我做一个简单的小结,希望对大家有用!!! 1. 首先版本更新的操作需要在进入主页面前执行,就是说最好不在主页面执行,才能...

    对于安卓的版本更新,相信很多人都不会陌生,它主要包括强制更新和正常提示更新,现在就对于这方面我做一个简单的小结,希望对大家有用!!!

    1. 首先版本更新的操作需要在进入主页面前执行,就是说最好不在主页面执行,才能显得正常,这个页面一般就是我们说的欢迎页面WelcomeActivity

    2. 通过获取服务器端的versioncode和本地获取的eversioncode进行比较,如果服务器code>本地code,说明已经出现了新的版本,再判断服务器返回的另外一个字段foce的值判断是否需要强制更新!

    <pre style="font-family: 宋体; font-size: 11.3pt; background-color: rgb(255, 255, 255);">
    

    这个是进入欢迎页执行网络请求: 
     UpDateVersion updatever;
    
    
      updatever = new UpDateVersion(StartActivity.this);
            updatever.setNewVersionListener(new UpDateVersion.NewVersionListener() {
                @Override
                public void onNewVersion() {
                    myHandler.removeCallbacksAndMessages(null);
                }
            });
            updatever.setUpdateCancelListener(new UpDateVersion.UpdateCancelListener() {
                @Override
                public void onUpdateCancel() {
                    startMain();
                }
            });
            Runnable runnable=new Runnable() {
    
                @Override
                public void run() {
                    // TODO Auto-generated method stub
                    updatever.update();
                }
            };

    这个是执行网络请求和更新处理逻辑,里面用到了自自定义监听器和okhttp

    <pre name="code" class="java">package com.joytouch.superlive.widget.updateVersion;
    
    import android.app.Activity;
    import android.app.Dialog;
    import android.content.Context;
    import android.content.DialogInterface;
    import android.content.SharedPreferences;
    import android.text.TextUtils;
    import android.util.Log;
    import android.view.MotionEvent;
    import android.view.View;
    import android.widget.Button;
    import android.widget.TextView;
    
    import com.google.gson.Gson;
    import com.joytouch.superlive.R;
    import com.joytouch.superlive.app.Preference;
    import com.joytouch.superlive.javabean.SoftwareUpdate;
    import com.joytouch.superlive.utils.HttpRequestUtils;
    import com.joytouch.superlive.utils.MD5Util;
    import com.joytouch.superlive.utils.PackageUtils;
    import com.joytouch.superlive.utils.city.File_Util;
    import com.joytouch.superlive.utils.view.DownLoadApkTask;
    
    import java.io.IOException;
    import java.util.ArrayList;
    import java.util.Collections;
    import java.util.HashMap;
    
    import okhttp3.FormBody;
    
    /**
     * Created by Administrator on 5/11 0011.
     */
    public class UpDateVersion {
        private final SharedPreferences sp;
        /**
         flag
         普通升级--[1]--杀进程重启后有提示(暂不升级,立刻升级),点击返回键,不退出app,不做页面跳转;
         中级升级--[2]--杀进程重启,挂起后再启动提示(暂不升级,立刻升级),点击返回键,不退出app,不做页面跳转;
         强制升级--[3]--任何方式进入app,提示升级(立刻升级);点击返回键,直接退出;
         */
        private   Context context;
        private String flag="0";//默认普通升级
        private NewVersionListener newVersionListener_;
        private UpdateCancelListener updateCancelListener_;
        private boolean isUpdate=false;
    
        public UpDateVersion(Context context) {
            this.context=context;
            sp = context.getSharedPreferences(Preference.preference,
                    Context.MODE_PRIVATE);
        }
    
    
    
        public void update(){
            String channel_b = PackageUtils.getSource(context);
            String codeVer_b = String.valueOf(PackageUtils.getVersionCode(context));
            String softname_b = Preference.softname;
            String ver_b = PackageUtils.getVersionName(context);
    
            HashMap<String, String> map = new HashMap<String, String>();
            map.put("channel", channel_b);
            map.put("codeVer", codeVer_b);
            map.put("softname", softname_b);
            map.put("ver", ver_b);
            map.put("version", Preference.version);
            String sign = getMD5(map);
    
            FormBody.Builder build=new FormBody.Builder();
            build
                    .add("channel", channel_b)
                    .add("codeVer", codeVer_b)
                    .add("softname", softname_b)
                    .add("ver", ver_b)
                    .add("version", Preference.version)
                    .add("sign", sign)
                    .build();
            new HttpRequestUtils((Activity) context).httpPost(Preference.update_url, build,
                    new HttpRequestUtils.ResRultListener() {
                        @Override
                        public void onFailure(IOException e) {
                            //获取网络数据失败会跳转到主页面
    //                        Intent intent=new Intent(context, MainActivity.class);
    //                        context.startActivity(intent);
                        }
    
                        @Override
                        public void onSuccess(String json) {
                            Log.e("版本更新", json);
                            String json_ = File_Util.readAssets(context, "banben.json");
                            Gson gson = new Gson();
                            SoftwareUpdate Bean = gson.fromJson(json, SoftwareUpdate.class);
    
                                //本版本
                                int version_code = PackageUtils.getVersionCode(context);
                                int newVersion = 0;
    
                                String ver = Bean.ver;
                                String updateDescription = Bean.updateDescription;
                                String downloadUrl = Bean.downloadUrl;
                                String codeVer = Bean.codeVer;
                                int force = Bean.force;
    
                                if (!TextUtils.isEmpty(codeVer)) {
                                    newVersion = Integer.parseInt(codeVer);
                                }
    //                            当本地的versioncode小于服务器传来的newVersion时,并且force>0,才会提示更新
                                if (version_code < newVersion) {
                                    //后台数据force,force>1升级
                                    if (force >0) {
                                        if (newVersionListener_ != null) {
                                            newVersionListener_.onNewVersion();
                                        }
                                        setUpdate(Bean);
                                    } else {
                                        updateCancelListener_.onUpdateCancel();
                                    }
                                    //本地保存一个forcr_,用于判定是哪种类型的更新
                                    sp.edit().putInt("updateversion",force).commit();
                                }else{
                                    //force_==4,表示不属于任何一种更新
                                    sp.edit().putInt("updateversion",4).commit();
                                    updateCancelListener_.onUpdateCancel();
    //                                ((Activity) context).finish();
                                }
                        }
                    });
        }
    
        private static Dialog dialog;
    
        private void setUpdate(final SoftwareUpdate bean) {
            dialog = new Dialog(context, R.style.Dialog_bocop);
            dialog.setContentView(R.layout.updateversiondialog);
            dialog.setCanceledOnTouchOutside(false);// 设置点击屏幕Dialog不消失dialog
            dialog.setCancelable(false);
            TextView tvtv=(TextView)dialog.findViewById(R.id.tvtv);
            tvtv.setOnTouchListener(new View.OnTouchListener() {
                @Override
                public boolean onTouch(View v, MotionEvent event) {
                    return true;
                }
            });
            TextView tv_title = (TextView) dialog.findViewById(R.id.tv_title);
            TextView tv_content = (TextView) dialog.findViewById(R.id.tv_content);
            tv_content.setVisibility(View.VISIBLE);
            tv_title.setText("升级提示");
            tv_content.setText(bean.updateDescription);
    
            Button btn_cancel = (Button) dialog.findViewById(R.id.btn_cancel);
            Button btn_submit = (Button) dialog.findViewById(R.id.btn_submit);
    
            //强制升级,force=3;
            //中等升级,force=2;
            //普通升级:force=1;
            //不升级,force=0;没有提示,>0都有提示
            if ("3".equals(bean.force+"")) {
                btn_cancel.setVisibility(View.GONE);
            }
            btn_cancel.setText("暂不更新");
            btn_submit.setText("立刻下载");
    
            btn_cancel.setOnClickListener(new View.OnClickListener() {
    
                @Override
                public void onClick(View v) {
                    // TODO Auto-generated method stub
                    dialog.dismiss();
                }
            });
            btn_submit.setOnClickListener(new View.OnClickListener() {
    
                @Override
                public void onClick(View v) {
                    // TODO Auto-generated method stub
                    isUpdate = true;
                    new DownLoadApkTask((Activity) context, "update.apk", bean.downloadUrl).execute();
                    dialog.dismiss();
                }
            });
    
            dialog.setOnDismissListener(new DialogInterface.OnDismissListener() {
                @Override
                public void onDismiss(DialogInterface dialog) {
                    // TODO Auto-generated method stub
                    if (!isUpdate &&updateCancelListener_ != null) {
                        if ("3".equals(bean.force+"")) {
                            //强制,后台挂起与杀进程都会提示,且退出程序
                            System.exit(0);
                        }else if ("2".equals(bean.force+"")){
                            updateCancelListener_.onUpdateCancel();
                            //中等更新,杀进程,后台挂起都会提示
    
                        }else if ("1".equals(bean.force+"")){
                            updateCancelListener_.onUpdateCancel();
                            //普通更新,只有杀进程才会提示
    
                        }else{
                            updateCancelListener_.onUpdateCancel();
                        }
    
                    }
                }
            });
    
            dialog.setCanceledOnTouchOutside(true);
            dialog.show();
    
        }
        private static String getMD5(HashMap<String, String> map) {
    
            ArrayList<String> keyList = new ArrayList<String>();
            for (String key : map.keySet()) {
                keyList.add(key);
            }
            Collections.sort(keyList);
    
            StringBuffer buffer = new StringBuffer();
            buffer.append(Preference.key_f);
            for (String key : keyList) {
                buffer.append(map.get(key));
            }
            buffer.append(Preference.key_b);
            return MD5Util.md5(buffer.toString());
        }
    
    
        public void cancel() {
    
        }
    
        public interface NewVersionListener {
            public void onNewVersion();
        }
    
        public interface UpdateCancelListener {
            public void onUpdateCancel();
        }
    
        public void setNewVersionListener(NewVersionListener newVersionListener) {
            newVersionListener_ = newVersionListener;
        }
        public void setUpdateCancelListener(UpdateCancelListener updateCancelListener) {
            updateCancelListener_ = updateCancelListener;
        }
    
    
    }
    

    
    okhttp网络请求工具类
    

    package com.joytouch.superlive.utils;
    
    import android.app.Activity;
    import android.view.View;
    import android.view.animation.Animation;
    import android.view.animation.LinearInterpolator;
    import android.view.animation.RotateAnimation;
    import android.widget.ImageView;
    import android.widget.LinearLayout;
    
    import com.joytouch.superlive.R;
    
    import java.io.File;
    import java.io.IOException;
    import java.util.concurrent.TimeUnit;
    
    import okhttp3.Call;
    import okhttp3.Callback;
    import okhttp3.FormBody;
    import okhttp3.MediaType;
    import okhttp3.MultipartBody;
    import okhttp3.OkHttpClient;
    import okhttp3.Request;
    import okhttp3.RequestBody;
    import okhttp3.Response;
    
    /**
     * Created by yj on 2016/4/22.
     * 使用方式:
         FormBody.Builder build=new FormBody.Builder();
         build.add("token", "AFAF2806-5AE1-3D90-4C18-0050AF2DE2D")
         .add("phone", "1")
         .add("content", "helougewei")
         .add("version", "4")
         .add("zb_id", "41622")
         .add("show_type", "chat")
         .build();
          new HttpRequestUtils(ChargeActivity.this).httpPost("http://www.qiuwin.com/I/v1.php/SuperLive4/ChatClient.json", build,
          new HttpRequestUtils.ResRultListener() {
            @Override
            public void onFailure(IOException e) {}
            @Override
            public void onSuccess(String json) {
            Gson gson = new Gson();
            BaseBean  bean = gson.fromJson(json, BaseBean.class);
            Log.e("测试",bean.message);}
            });
     * okhttp请求封装累
     */
    public class HttpRequestUtils {
        private OkHttpClient httpClient;
        private Call call;
        private Activity activity;
        private long timeout = 10;
        private LinearLayout loadingfailed;
        private LinearLayout refreshll;
        private ImageView refresh;
        private View view;
        private boolean isloading = false;
        private String type;
        public HttpRequestUtils(Activity activity,View view,boolean isup) {
            //创建okhttp对象
            httpClient = new OkHttpClient();
            httpClient.newBuilder().connectTimeout(timeout, TimeUnit.SECONDS)
            .readTimeout(timeout,TimeUnit.SECONDS)
            .writeTimeout(timeout, TimeUnit.SECONDS);
            this.view = view;
            this.activity = activity;
            if(!isup) {
                loadingfailed = (LinearLayout) view.findViewById(R.id.loading_failed);
                refreshll = (LinearLayout) view.findViewById(R.id.refreshll);
                refresh = (ImageView) view.findViewById(R.id.refresh_logo);
                isloading = true;
            }else{
                isloading = false;
            }
    
    
        }
        public HttpRequestUtils(Activity activity) {
            //创建okhttp对象
            httpClient = new OkHttpClient();
            httpClient.newBuilder().connectTimeout(timeout, TimeUnit.SECONDS)
                    .readTimeout(timeout, TimeUnit.SECONDS)
                    .writeTimeout(timeout, TimeUnit.SECONDS);
            this.activity = activity;
            isloading = false;
        }
        //取消请求
        private void cancel(){
            if(call!= null){
                call.cancel();
            }
        }
        //get请求
        public void httpGet(String url, final ResRultListener resRultListener){
            //创建一个请求
            final Request request = new Request.Builder().url(url).build();
            //创建一个呼叫请求
            call = httpClient.newCall(request);
            //创建一个异步请求
            call.enqueue(new Callback() {
                @Override
                public void onFailure(Call call, IOException e) {
                    if(resRultListener !=null){
                        resRultListener.onFailure(e);
                    }
                }
    
                @Override
                public void onResponse(Call call, Response response) throws IOException {
                    final String json = response.body().string();
                    activity.runOnUiThread(new Runnable() {
                        @Override
                        public void run() {
                            if (resRultListener != null) {
                                resRultListener.onSuccess(json);
                            }
                        }
                    });
    
    
                }
            });
        }
        //post的请求
        public void httpPost(final String url , final FormBody.Builder builder,final ResRultListener resRultListener){
    
            RequestBody body = builder.build();
            Request request = new Request.Builder()
                    .url(url).post(body).build();
            String bodycontent = "";
            int length = builder.build().size();
            if(LogUtils.isOpen()) {
                for (int i = 0; i < length; i++) {
                    bodycontent = bodycontent + builder.build().encodedName(i) + "=" + builder.build().encodedValue(i)+"&";
                }
            }
            LogUtils.e("builder", bodycontent);
            if(isloading) {
                loading();
            }
            //创建一个呼叫请求
            call = httpClient.newCall(request);
            //创建一个异步请求
            call.enqueue(new Callback() {
                @Override
                public void onFailure(Call call, final IOException e) {
    
                    activity.runOnUiThread(new Runnable() {
                        @Override
                        public void run() {
                            if(resRultListener !=null){
    
                                resRultListener.onFailure(e);
                                if(isloading) {
                                    loadingFailed(url,builder,resRultListener);
                                }
    //                            LogUtils.e("exception", e.getMessage());
                            }
                        }
                    });
                }
    
                @Override
                public void onResponse(Call call, Response response) throws IOException {
                    final String json = response.body().string();
                    LogUtils.e("json",json);
                    activity.runOnUiThread(new Runnable() {
                        @Override
                        public void run() {
                            if (resRultListener != null) {
                                if(isloading) {
                                    loadinSuccess();
                                }
                                resRultListener.onSuccess(json);
                            }
                        }
                    });
    
    
                }
            });
    
        }
    
        //post的请求上传单张图片
        public void httpPostImage(String url ,String filekey,String filePath,String imageName,final ResRultListener resRultListener){
            File file = new File(filePath);
            MultipartBody.Builder builder = new MultipartBody.Builder();
            builder.setType(MultipartBody.FORM);
            builder.addFormDataPart(filekey, imageName, RequestBody.create(MediaType.parse("image/png"), file));
            Request request = new Request.Builder()
                    .url(url).post(builder.build()).build();
            //创建一个呼叫请求
            call = httpClient.newCall(request);
            //创建一个异步请求
            call.enqueue(new Callback() {
                @Override
                public void onFailure(Call call, final IOException e) {
                    activity.runOnUiThread(new Runnable() {
                        @Override
                        public void run() {
                            if (resRultListener != null) {
                                resRultListener.onFailure(e);
    
                            }
                        }
                    });
    
                }
    
                @Override
                public void onResponse(Call call, Response response) throws IOException {
                    final String json = response.body().string();
                    activity.runOnUiThread(new Runnable() {
                        @Override
                        public void run() {
                            if (resRultListener != null) {
    
                                resRultListener.onSuccess(json);
                            }
                        }
                    });
    
    
                }
            });
    
        }
    //请求结果回调
    public interface ResRultListener{
        void onFailure(IOException e);
       void onSuccess(String json);
    }
        public  void loading(){
            if(this.view == null){
                LogUtils.e("sssssssssssss","///");
            }
            view.setVisibility(View.VISIBLE);
            loadingfailed.setVisibility(View.GONE);
            refreshll.setVisibility(View.VISIBLE);
            RotateAnimation an = new RotateAnimation(0, 360, Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF, 0.5f);
            an.setInterpolator(new LinearInterpolator());//不停顿
            an.setRepeatCount(-1);//重复次数
            an.setFillAfter(true);//停在最后
            an.setDuration(600);
            refresh.startAnimation(an);
    
        }
        public void loadingFailed(final String url , final FormBody.Builder builder,final ResRultListener resRultListener){
            loadingfailed.setVisibility(View.VISIBLE);
            refreshll.setVisibility(View.GONE);
            refresh.clearAnimation();
            loadingfailed.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
                    LogUtils.e("loadingfailed", url);
                    httpPost(url, builder, resRultListener);
                }
            });
    
        }
        public void loadinSuccess(){
            refresh.clearAnimation();
            view.setVisibility(View.GONE);
            loadingfailed.setVisibility(View.GONE);
        }
    
    }
    

    在使用Android studio时需要的build.gradle文件

    dependencies {
        compile fileTree(dir: 'libs', include: ['*.jar'])
        compile 'com.github.ctiao:DanmakuFlameMaster:0.4.6'
        compile files('libsbammsdk.jar')
        compile files('libs/universal-image-loader-1.9.4-SNAPSHOT.jar')
        compile files('libstpmime-4.1.3.jar')
        compile files('libs/gson-2.2.1.jar')
        compile files('libs/jpush-android-2.1.0.jar')
        compile files('libs/mta-sdk-1.6.2.jar')
        compile files('libs/open_sdk_r5509.jar')
        compile files('libs/SocialSDK_QQZone_3.jar')
        compile files('libs/SocialSDK_tencentWB_1.jar')
        compile files('libs/SocialSDK_WeiXin_2.jar')
        compile files('libs/wkimageloader.jar')
        compile 'com.umeng.analytics:analytics:latest.integration'
        compile 'com.squareup.okhttp3:okhttp:3.2.0'
        compile 'com.android.support:support-v4:22.2.1'
        compile 'com.zhy:flowlayout-lib:1.0.1'
        compile 'com.qiniu:happy-dns:0.2.7'
        //主播特点标签
        compile 'com.android.support:recyclerview-v7:24.0.0-alpha1'
        compile 'com.lsjwzh:materialloadingprogressbar:0.5.8-RELEASE'
        compile 'com.flyco.dialog:FlycoDialog_Lib:1.1.0@aar'
        compile 'com.flyco.animation:FlycoAnimation_Lib:1.0.0@aar'
        compile 'com.nineoldandroids:library:2.4.0'
        compile files('libshttpserver-0.1.2.jar')
        compile files('libshttputils-1.4.0.jar')
        compile files('libsio-1.6.0.jar')
        compile files('libstils3.1.8.jar')
        compile files('libs/SocialSDK_tencentWB_2.jar')
        compile files('libs/commons-codec-1.4.jar')
        compile files('libs/pldroid-player-1.2.2.jar')
        compile files('libs/alipaySDK-20150610.jar')
        compile files('libs/commons-codec-1.4.jar')
        compile files('libs/pldroid-player-1.2.2.jar')
        compile files('libs/support-v13-13.0.0.jar')
        compile files('libs/pldroid-camera-streaming-1.7.1.jar')
        compile files('libs/armeabi/BaiduNaviSDK_3.2.0.jar')
        compile files('libs/armeabi/httpmime-4.1.2.jar')
        compile files('libs/BaiduNaviSDK_3.2.0.jar')
    }



    展开全文
  • 因为模拟器的系统版本过低,现在安卓系统已经到8了,但是夜神模拟器的系统还是4.4。所以浏览器版本也过低,不支持我们目前的写法。   三、解决方案 1.cnpm安装 cnpm i babel-polyfill --save cnpm i es6-...

    一、问题描述

    用户在用夜神安卓模拟器时打开我方APP时,H5页面显示空白!

     

    二、问题分析

    因为模拟器的系统版本过低,现在安卓系统已经到8了,但是夜神模拟器的系统还是4.4。所以浏览器版本也过低,不支持我们目前的写法。

     

    三、解决方案

    1.cnpm安装

    cnpm i babel-polyfill --save

    cnpm i es6-promise --save

     

    2.main.js引入

    import ‘babel-polyfill‘

    import Es6Promise from ‘es6-promise‘

    Es6Promise.polyfill()

     

    3.webpack.base.conf.js

    module.exports = {

    entry: {

      "babel-polyfill":"babel-polyfill",
      app: ‘./src/main.js‘
    }

    展开全文
  • 果不其然,现在微软王牌产品 Office 三件套又以全新面貌登场。开发者在 App 欢迎页以「Office 已重塑」形容这款新品。事实也确实如此。新的 Office 是大家期盼已久的 Word+Excel+PowerPoint 三合一...
    10 月,微软的新品发布会时。他们推出了一款双屏「手机」 Surface Duo。f09b30876f5e17adb012b652af115b32.png这个奇特的产品让大家意识到。微软仍然没有放弃移动端。甚至决心和投入更大了。果不其然,现在微软王牌产品 Office 三件套又以全新面貌登场。a90b5fbb4a299c3d5a91488d772b7a4d.png开发者在 App 欢迎页以「Office 已重塑」形容这款新品。事实也确实如此。新的 Office 是大家期盼已久的 Word+Excel+PowerPoint 三合一版本。2a4834b1e3cc0fc7910f91cb70054cb2.png也是完全免费、不简陋也不沉重的新版本。可以说有着令人满意的完成度。鉴于大家对微软的行事风格有所了解。且微软作为安卓最佳开发者早已声名远播。我们也就不必多介绍这款 App 如何使用。单看一些细节就够了。

    移动端新版 Office 做的比较好的一点就是简练清晰。

    界面左中右、上中下每一个图标都有明确作用。每一元素的布局排版也更适合移动端。比如右上角是导入文件。中间用来查看编辑文档。右下则进行文档查看编辑之外的操作。dbda7982c7ce32dd5ea676995fa20bec.png所以尽管新 Office 是个 90M 的大应用。用起来还是轻快舒适。深入文档内部的话。大家熟悉的工具和操作也一应俱全,清清楚楚。0c37af075a5c0700951b983629d371e1.png先前点一下就进入编辑状态的毛病已经改掉了。5aa8233b0e24d515ab7d7d96bb25a037.png表格和 PPT、PDF 等其他文件的体验也差不多。9b8addad233d7fef04b3d9a86884253d.png
    当然,移动端新 Office 不止是简单的三个合并成一个。而是对 Office 整套应用功能的浓缩和整合。如微软所言 All in One。新 Office 可以直接写便笺。并同步到 Windows 中。54dcd630533b402df6b84f6ed7f24e69.png可以与附近的手机,或手机和计算机共享文件。03e5e176892b91d01ccaeb17598e501f.png虽然文件大小有限制。但传输过程还算稳定。72f74d4650a40656ae3af83ca12291ef.png另外 Office Lens,PDF 阅读器也都加入了新 Office 套餐0270097ef675cfb490309c2a390538c4.png图片转文字和图片转表格这两个常用功能。到了移动端表现也不失水准。d26ecd1ee916da884313bca900945548.png图片转 PDF、文档转 PDF 也就不必多说。还有个小细节,就是新 Office 支持 PDF 手写签名了。be7211e60f2d97916484d78342a172ea.png
    微软 Office 和金山 WPS Office 是当今两大办公软件。在 PC 端,微软 Office 占有绝对优势。移动端则非 WPS Office 莫属。eea62d076f88ee2add378e51d0eb5623.png微软针对移动端推出的三件套和 Office Mobile 几乎被 WPS Office 吊打。究其原因在于移动端三件套没能很好地适应智能手机和移动操作系统的逻辑,更像 PC 端照搬过去。新 Office 最大的改进就是比以往更适合移动端。简练明确的 UI、多方整合的功能、跨设备的文档共享等等。都让移动版 Office 顺手许多。再加上没广告、全免费这两点。WPS Office 或许要紧张了呢。如果大家可以忍受文件加载速度稍慢、缺少重命名,批量删除、便笺大图无法自适应、偶尔卡顿等小毛病。(毕竟测试版5c5060d502374647f9b20a22fc85c98a.png)4d39821b6c1d569fafdfa3e9045fb8b8.png新 Office 是非常好的选择。微信搜索【锋潮评测室】后台回复 468 下载安装包应用支持 Android+iOS 双平台d49b8e8539a201e291a7ce291f12cfe3.gif7ce91bf079a4e28e790802f01d43d8b7.png为安卓最佳开发者微软鼓掌e7fab61a8fb413d7de2b88ddbac65489.gif
    展开全文
  • 你好,我现在想要用你的文章里的代码写一个root工具,看到其中有一个diag设备,这个设备是radio设备吗?这个漏洞是安卓的哪个版本的漏洞呢?一般的安卓系统的dev文件中都没有见到diag这个设备呐,麻烦你啦
  • Android 手机在API19以上(包括19 即安卓4.4版本)开始全面兼容Emoji 但是兼容的Emoji个数有限 现在把所有的Emoji 列出来 方便大家使用 项目传到GitHub 上了 方便查看 github: ... ? ? ? ? ☺ ...
  • 现在想转安卓开发,在网上找到的视频是用的eclipse3.4版本的,是不是版本太老了?
  • 目前智能手机两大阵营之一的安卓手机系统已经更新到了安卓10了,而过去这些年安卓手机的每一代革新也是我们一起见证的,现在更新到了安卓10,但是不是每个人都已经在开始用安卓10了,毕竟更新换代都是一个过程,近日...
  • 代码没问题, 应该是系统限制了硬件标识符访问权为给用户提供更严格的数据保护,从此版本开始,对于使用 WLAN API 和 Bluetooth API 的应用,Android 移除了对设备本地硬件标识符的编程访问权。WifiInfo....
  • 自从华为官宣华为鸿蒙 OS之后,谷歌方面可能已经感到了一丝威胁。因为从华为开发者大会上公布的数据来看,华为鸿蒙 OS的应用场景和设备确实要比...安卓系统命名从最初的蛋糕到现在的派,谷歌都会为每一个Android大版...
  • 因为模拟器的系统版本过低,现在安卓系统已经到8了,但是夜神模拟器的系统还是4.4。所以浏览器版本也过低,不支持我们目前的写法。 三、解决方案 1.cnpm安装 cnpm i babel-polyfill --save cnpm i es6-promi.....
  • 可本人用了苹果的产品5年了,对安卓手机刷机并不在行,上网搜了一些资料,历经一个通宵,前后花去12个小时(其中主要是下载合适的ROM费了时间),最终刷机成功,安卓版本升到了7.1,并可以正常安装目前流行A...
  • 初探 Compose 版本的玩安卓

    千次阅读 多人点赞 2021-03-06 14:08:26
    Google 官方发布了 beta 版本的 Compose 之后举办了一个小比赛,分为四场,每周一场,现在为止已经过去了一场,没有赶上第一场的不要担心,还有剩下三场。 国内的安卓大佬们都开始摩拳擦掌,扔物线大佬先发了一篇...
  • 谷歌于年初发布了安卓11的2个开发者版本了,我们简单回顾一下吧。1.网络连接由于现在三大运营商现在的5G套餐中,目前并没有类似“冰激淋”无限流量的套餐,致使流量使用变得“谨小慎微”,所以谷歌针对5G网络连接性...
  • 现在有一个问题是在安卓9.0以上版本的手机上测试,刚进去就会宕机,游戏闪退,经过调查,得出以下结论: 安卓9.0以上版本的部分手机权限需要动态申请获取。主要是sd卡读取权限。 之前在androidmanifest.xml...
  • 大家都知道,国产手机现在使用的操作系统,全都是清一色的安卓系统,而且绝大多数的国产手机的处理器芯片,使用的也是美国的高通芯片。但是,就算美国真的向中国禁售手机芯片和安卓系统,对国产手机的影响也不会太大...
  • 三星平板N8000刷机升级安卓版本到7.1过程记录三星n8010系统升级 三星n8010系统升级 手里的GT-N8000出厂原装系统是4.1.2的,很多现在的APP安装时都会出现“安装包解析出错”、导致安装失败。机子自带的自动升级没有...
  • 今天,腾讯发布微信安卓7.0.10内测版,虽然只是一次小版本号的更新,但是本次更新可以说是一次重大的更新,新增了大家一直期盼的深色模式(黑暗模式/暗黑模式)。新增深色模式需要提到的是,深色功能适配Android10,...
  • 并且现在安卓已经更新到11版本了,中间有几个版本还需对App内部更新做适配,所以说这里记录一下。本笔记目前适配Android11版本。本文只讲下载和安装的核心,不对更新版本的校验和更新弹出框做优化,有需要的可以自行...
  • 有时我们的安卓手机在安装新版本app时,会出现安装失败情况,安卓给我们的回馈是系统已经存在更高版本,但是我们知道我们现在正在安装这个版本才是最高的,那是什么情况下会出现这种情况呢? 在我们的...
  • 一开始发布安卓版本只是为了做测试,现在倒成了一个问题了,原因其实很简单,下载的速度慢,还有就是目录不能有中文路径。 首先就是下载java和安卓SDK和模拟器,下载好之后先安装java,配置java的各个环境变量,...
  • 向客服询问了具体的设备信息:安卓系统版本号是4.2 下意识觉得是因为css的兼容问题,因为之前遇到过太多类似问题了。 因为现在css3大行其道,像 flex,transform,transition,animation等属性都有广泛的应用,当然...
  • Eclipse实现安卓客户端的版本更新

    千次阅读 2016-05-18 15:37:37
    现在上线的APP大多要用到版本更新的功能,所以自己参考了有关更新代码,封装成了一个类,方便使用。该类实现加载MainActivity的时候自动检测是否是最新版本,如果不是则提示更新安装等操作。 1.权限声明<!-- 访问...
  • 所以从几天前,我就开始准备下载这些软件,经过我亲测后,现在来给你们来推荐好用的自动点击器,推荐之前,还是带你们来学习了解一下吧。什么是自动点击器? “自动点击器”它是一款非常强大的手机屏幕自动点击软件...
  • 安卓2.x的版本使用4.x的主题

    千次阅读 2015-01-04 10:48:58
    现在,还有大部分安卓开发者在开发安卓APP时使用的是2.x的SDK版本,为了兼容2.x的手机这本倒无可厚非,但最令人头痛的就是2.x版本的主题是在太丑了,这是安卓刚推出时只考虑到了使用,并没考虑到美观,而现在上至...
  • <div><p><strong>WARNING: 如果不按照这个表格,我们将无法帮助你,...现在安卓六可以用,八不好使</p><p>该提问来源于开源项目:jpush/jmessage-phonegap-plugin</p></div>

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,189
精华内容 475
关键字:

安卓现在版本