精华内容
下载资源
问答
  • 这个demo实现了android开发应用内下载安装apk升级版本功能,非常简便轻量集成,完全原生代码即可实现,无需第三方框架。。。
  • android版本更新功能

    万次阅读 多人点赞 2016-05-20 11:22:28
    1、检测是否有新版本 //访问服务器是否有新版本发布 UpdateVersionUtil.checkVersion(MainActivity.this); //设置版本更新的回调接口 UpdateVersionUtil.setUpdateListener(new UpdateListener() { @...

    github地址:https://github.com/wj576038874/DownloadUpdate

    使用retrfit2 rxjava2 okhttp3实现多文件多线程下载(支持断点下载), android版本更新:通知栏更新,对话框更新 兼容8.0

    此博客中的内容是比较老的版本了,可以不用看了,可以直接下载githubhttps://github.com/wj576038874/DownloadUpdate上的最新版本,通知栏更新显示下载进度并且兼容8.0,支持多文件多线程断点下载

    github上的版本效果图:

           

    1、检测是否有新版本

    <pre class="java" name="code">public class MainActivity extends Activity {
    
    	private Button button;
    	
    	@Override
    	protected void onCreate(Bundle savedInstanceState) {
    		super.onCreate(savedInstanceState);
    		setContentView(R.layout.activity_main);
    		
    		button = (Button) findViewById(R.id.button1);
    		
    		button.setOnClickListener(new OnClickListener() {
    			
    			@Override
    			public void onClick(View v) {
    				//本地测试检测是否有新版本发布
    				UpdateVersionUtil.localCheckedVersion(MainActivity.this,new UpdateListener() {
    					
    					@Override
    					public void onUpdateReturned(int updateStatus, VersionInfo versionInfo) {
    						//判断回调过来的版本检测状态
    						switch (updateStatus) {
    						case UpdateStatus.YES:
    							//弹出更新提示
    							UpdateVersionUtil.showDialog(MainActivity.this,versionInfo);
    							break;
    						case UpdateStatus.NO:
    							//没有新版本
    							ToastUtils.showToast(getApplicationContext(), "已经是最新版本了!");
    							break;
    						case UpdateStatus.NOWIFI:
    							//当前是非wifi网络
    							ToastUtils.showToast(getApplicationContext(), "只有在wifi下更新!");
    //							DialogUtils.showDialog(MainActivity.this, "温馨提示","当前非wifi网络,下载会消耗手机流量!", "确定", "取消",new DialogOnClickListenner() {
    //								@Override
    //								public void btnConfirmClick(Dialog dialog) {
    //									dialog.dismiss();
    //									//点击确定之后弹出更新对话框
    //									UpdateVersionUtil.showDialog(SystemActivity.this,versionInfo);
    //								}
    //								
    //								@Override
    //								public void btnCancelClick(Dialog dialog) {
    //									dialog.dismiss();
    //								}
    //							});
    							break;
    						case UpdateStatus.ERROR:
    							//检测失败
    				        	ToastUtils.showToast(getApplicationContext(), "检测失败,请稍后重试!");
    							break;
    						case UpdateStatus.TIMEOUT:
    							//链接超时
    				        	ToastUtils.showToast(getApplicationContext(), "链接超时,请检查网络设置!");
    							break;
    						}
    					}
    				});
    				
    				/**
    				 * //访问服务器 试检测是否有新版本发布
    				UpdateVersionUtil.localCheckedVersion(MainActivity.this,new UpdateListener() {
    					
    					@Override
    					public void onUpdateReturned(int updateStatus, VersionInfo versionInfo) {
    						//判断回调过来的版本检测状态
    						switch (updateStatus) {
    						case UpdateStatus.YES:
    							//弹出更新提示
    							UpdateVersionUtil.showDialog(MainActivity.this,versionInfo);
    							break;
    						case UpdateStatus.NO:
    							//没有新版本
    							ToastUtils.showToast(getApplicationContext(), "已经是最新版本了!");
    							break;
    						case UpdateStatus.NOWIFI:
    							//当前是非wifi网络
    							ToastUtils.showToast(getApplicationContext(), "只有在wifi下更新!");
    //							DialogUtils.showDialog(MainActivity.this, "温馨提示","当前非wifi网络,下载会消耗手机流量!", "确定", "取消",new DialogOnClickListenner() {
    //								@Override
    //								public void btnConfirmClick(Dialog dialog) {
    //									dialog.dismiss();
    //									//点击确定之后弹出更新对话框
    //									UpdateVersionUtil.showDialog(SystemActivity.this,versionInfo);
    //								}
    //								
    //								@Override
    //								public void btnCancelClick(Dialog dialog) {
    //									dialog.dismiss();
    //								}
    //							});
    							break;
    						case UpdateStatus.ERROR:
    							//检测失败
    				        	ToastUtils.showToast(getApplicationContext(), "检测失败,请稍后重试!");
    							break;
    						case UpdateStatus.TIMEOUT:
    							//链接超时
    				        	ToastUtils.showToast(getApplicationContext(), "链接超时,请检查网络设置!");
    							break;
    						}
    					}
    				});
    				 */
    			}
    		});
    	}
    }

    2、版本检测的工具类
    <pre class="java" name="code">/**
     * 
     * @author	wenjie
     *	版本更新的工具类
     */
    public class UpdateVersionUtil{
    	
    	/**
    	 * 接口回调
    	 * @author wenjie
    	 *
    	 */
    	public interface UpdateListener{
    		void onUpdateReturned(int updateStatus,VersionInfo versionInfo);
    	}
    	
    	public UpdateListener updateListener;
    	
    	public void setUpdateListener(UpdateListener updateListener) {
    		this.updateListener = updateListener;
    	}
    	
    	/**
    	 * 网络测试 检测版本
    	 * @param context 上下文
    	 */
    	public static void checkVersion(final Context context,final UpdateListener updateListener){
    		HttpRequest.get(ServerReqAddress.UPDATA_VERSION_REQ, new RequestCallBackListener() {
    			
    			@Override
    			public void onSuccess(String resultData) {
    				try {
    					JSONObject jsonObject = JsonUtil.stringToJson(resultData);
    					JSONArray array = jsonObject.getJSONArray("data");
    					VersionInfo mVersionInfo = JsonUtil.jsonToBean(array.getJSONObject(0).toString(), VersionInfo.class);
    					int clientVersionCode = ApkUtils.getVersionCode(context);
    					int serverVersionCode = mVersionInfo.getVersionCode();
    					//有新版本
    					if(clientVersionCode < serverVersionCode){
    						int i = NetworkUtil.checkedNetWorkType(context);
    						if(i == NetworkUtil.NOWIFI){
    							updateListener.onUpdateReturned(UpdateStatus.NOWIFI,mVersionInfo);
    						}else if(i == NetworkUtil.WIFI){
    							updateListener.onUpdateReturned(UpdateStatus.YES,mVersionInfo);
    						}
    					}else{
    						//无新本
    						updateListener.onUpdateReturned(UpdateStatus.NO,null);
    					}
    				} catch (Exception e) {
    					e.printStackTrace();
    					updateListener.onUpdateReturned(UpdateStatus.ERROR,null);
    				}
    			}
    			
    			@Override
    			public void onFailure(String error) {
    				updateListener.onUpdateReturned(UpdateStatus.TIMEOUT,null);
    			}
    		});
    	}
    	
    	
    	/**
    	 * 本地测试
    	 */
    	public static void localCheckedVersion(final Context context,final UpdateListener updateListener){
    		try {
    //			JSONObject jsonObject = JsonUtil.stringToJson(resultData);
    //			JSONArray array = jsonObject.getJSONArray("data");
    //			VersionInfo mVersionInfo = JsonUtil.jsonToBean(array.getJSONObject(0).toString(), VersionInfo.class);
    			VersionInfo mVersionInfo = new VersionInfo();
    			mVersionInfo.setDownloadUrl("http://gdown.baidu.com/data/wisegame/57a788487345e938/QQ_358.apk");
    			mVersionInfo.setVersionDesc("\n更新内容:\n1、增加xxxxx功能\n2、增加xxxx显示!\n3、用户界面优化!\n4、xxxxxx!");
    			mVersionInfo.setVersionCode(2);
    			mVersionInfo.setVersionName("v2020");
    			mVersionInfo.setVersionSize("20.1M");
    			mVersionInfo.setId("1");
    			int clientVersionCode = ApkUtils.getVersionCode(context);
    			int serverVersionCode = mVersionInfo.getVersionCode();
    			//有新版本
    			if(clientVersionCode < serverVersionCode){
    				int i = NetworkUtil.checkedNetWorkType(context);
    				if(i == NetworkUtil.NOWIFI){
    					updateListener.onUpdateReturned(UpdateStatus.NOWIFI,mVersionInfo);
    				}else if(i == NetworkUtil.WIFI){
    					updateListener.onUpdateReturned(UpdateStatus.YES,mVersionInfo);
    				}
    			}else{
    				//无新本
    				updateListener.onUpdateReturned(UpdateStatus.NO,null);
    			}
    		} catch (Exception e) {
    			e.printStackTrace();
    			updateListener.onUpdateReturned(UpdateStatus.ERROR,null);
    		}
    	}
    	
    	
    	/**
    	 * 弹出新版本提示
    	 * @param context 上下文
    	 * @param versionInfo 更新内容
    	 */
    	public static void showDialog(final Context context,final VersionInfo versionInfo){
    		final Dialog dialog = new AlertDialog.Builder(context).create();
    		final File file = new File(SDCardUtils.getRootDirectory()+"/updateVersion/gdmsaec-app.apk");
    		dialog.setCancelable(true);// 可以用“返回键”取消  
    		dialog.setCanceledOnTouchOutside(false);//
    		dialog.show();
    		View view = LayoutInflater.from(context).inflate(R.layout.version_update_dialog, null);
    		dialog.setContentView(view);
    		
    		final Button btnOk = (Button) view.findViewById(R.id.btn_update_id_ok);
    		Button btnCancel = (Button) view.findViewById(R.id.btn_update_id_cancel);
    		TextView tvContent = (TextView) view.findViewById(R.id.tv_update_content);
    		TextView tvUpdateTile = (TextView) view.findViewById(R.id.tv_update_title);
    		final TextView tvUpdateMsgSize = (TextView) view.findViewById(R.id.tv_update_msg_size);
    		
    		tvContent.setText(versionInfo.getVersionDesc());
    		tvUpdateTile.setText("最新版本:"+versionInfo.getVersionName());
    		
    		if(file.exists() && file.getName().equals("gdmsaec-app.apk")){
    			tvUpdateMsgSize.setText("新版本已经下载,是否安装?");
    		}else{
    			tvUpdateMsgSize.setText("新版本大小:"+versionInfo.getVersionSize());
    		}
    		
    		btnOk.setOnClickListener(new OnClickListener() {
    			@Override
    			public void onClick(View v) {
    				dialog.dismiss();
    				if(v.getId() == R.id.btn_update_id_ok){
    					//新版本已经下载
    					if(file.exists() && file.getName().equals("gdmsaec-app.apk")){
    						Intent intent = ApkUtils.getInstallIntent(file);
    						context.startActivity(intent);
    					}else{
    						//没有下载,则开启服务下载新版本
    						Intent intent = new Intent(context,UpdateVersionService.class);
    						intent.putExtra("downloadUrl", versionInfo.getDownloadUrl());
    						context.startService(intent);
    					}
    				}
    			}
    		});
    		
    		btnCancel.setOnClickListener(new OnClickListener() {
    			@Override
    			public void onClick(View v) {
    				dialog.dismiss();
    			}
    		});
    	}
    	
    	/**
    	 * 收起通知栏
    	 * @param context
    	 */
    	public static void collapsingNotification(Context context) {
            Object service = context.getSystemService("statusbar");
            if (null == service)
                return;
            try {
                Class<?> clazz = Class.forName("android.app.StatusBarManager");
                int sdkVersion = android.os.Build.VERSION.SDK_INT;
                Method collapse;
                if (sdkVersion <= 16) {
                    collapse = clazz.getMethod("collapse");
                } else {
                    collapse = clazz.getMethod("collapsePanels");
                }
                collapse.setAccessible(true);
                collapse.invoke(service);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }

    3、版本检测的状态类
    <pre class="java" name="code">/**
     * 
     * @author wenjie
     *	检测版本的状态类
     */
    public interface UpdateStatus {
    	/**
    	 * 没有新版本
    	 */
    	public static int NO = 1;
    	
    	/**
    	 * 有新版本
    	 */
    	public static int YES = 2;
    	
    	/**
    	 * 链接超时
    	 */
    	public static int TIMEOUT = 3;
    	
    	/**
    	 * 没有wifi
    	 */
    	public static int NOWIFI = 4;
    	
    	/**
    	 * 数据解析出错
    	 */
    	public static int ERROR = -1;
    }

    4、版本更新的service   android7.0上 通知栏不兼容,可以用后面一个service,通知栏兼容7.0的,下载下来的demo直接替换掉这个类即可
    <pre class="java" name="code">/**
     * 
     * @author wenjie
     *	下载新版本的服务类
     */
    public class UpdateVersionService extends Service {
    
    	
    	private NotificationManager nm;
    	private Notification notification;
    	//标题标识
    	private int titleId = 0;
    	//安装文件
    	private File updateFile;
    	
    	private static HttpHandler<File> httpHandler;
    	private HttpUtils httpUtils;
    	
    	private long initTotal = 0;//文件的总长度
    	
    	@Override
    	public void onCreate() {
    		super.onCreate();
    		
    		httpUtils = new HttpUtils();
    		updateFile = new File(SDCardUtils.getRootDirectory()+"/updateVersion/gdmsaec-app.apk");
    		
    		nm = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
    		notification = new Notification();
    		notification.icon = R.drawable.ic_launcher;
    		notification.tickerText = "开始下载";
    		notification.when = System.currentTimeMillis();
    		notification.contentView = new RemoteViews(getPackageName(), R.layout.notifycation);
    		
    	}
    
    	@Override
    	public int onStartCommand(Intent intent, int flags, int startId) {
    		
    //		VersionInfo versionInfo = (VersionInfo) intent.getSerializableExtra("versionInfo");
    //		String url = versionInfo.getDownloadUrl();
    		Bundle bundle = intent.getExtras();
    		String url = bundle.getString("downloadUrl");
    		
    		PreferenceUtils.setString(UpdateVersionService.this, "apkDownloadurl", url);
    		
    		nm.notify(titleId, notification);
    		downLoadFile(url);
    		return super.onStartCommand(intent, flags, startId);
    	}
    
    	
    	
    	public void downLoadFile(String url){
    		
    		httpHandler = httpUtils.download(url,updateFile.getAbsolutePath(), true, false, new RequestCallBack<File>() {
    			
    			@Override
    			public void onSuccess(ResponseInfo<File> response) {
    				// 更改文字
                    notification.contentView.setTextViewText(R.id.msg, "下载完成!点击安装");
    //                notification.contentView.setViewVisibility(R.id.btnStartStop, View.GONE);
    //                notification.contentView.setViewVisibility(R.id.btnCancel,View.GONE);
                    // 发送消息
                    nm.notify(0, notification);
                    stopSelf();
                    //收起通知栏
                    UpdateVersionUtil.collapsingNotification(UpdateService.this);
                    //自动安装新版本
                    Intent installIntent = ApkUtils.getInstallIntent(updateFile);
                    startActivity(installIntent);
                    
    			}
    			
    			@Override
    			public void onFailure(HttpException error, String msg) {
    				//网络连接错误
    				if(error.getExceptionCode() == 0 ){
    					// 更改文字
    	                notification.contentView.setTextViewText(R.id.msg, "网络异常!请检查网络设置!");
    				}else if(error.getExceptionCode() == 416){//文件已经下载完毕
    					// 更改文字
    	                notification.contentView.setTextViewText(R.id.msg, "智慧海事");
    	                // 更改文字
    	                notification.contentView.setTextViewText(R.id.bartext, "检测到新版本已经下载完成,点击即安装!");
    	                // 隐藏进度条
    	                notification.contentView.setViewVisibility(R.id.progressBar1, View.GONE);
    	                
    	                Intent intent = ApkUtils.getInstallIntent(updateFile);
    	                PendingIntent pendingIntent = PendingIntent.getActivity(UpdateVersionService.this, 0, intent, 0);
    	                notification.flags = Notification.FLAG_AUTO_CANCEL;//点击通知栏之后 消失
    	                notification.contentIntent  = pendingIntent;//启动指定意图
    				}
                    // 发送消息
                    nm.notify(0, notification);
    			}
    
    			@Override
    			public void onLoading(long total, long current, boolean isUploading) {
    				if(initTotal == 0){//说明第一次开始下载
    					initTotal = total;
    				}
    				
    				if(initTotal != total){//说明下载过程中暂停过,文件的总长度出现问题  就把初始的文件的长度赋值给他重新计算已经下载的比例
    					total = initTotal;
    				}
    				
    				long l = current*100/total;
    				notification.contentView.setTextViewText(R.id.msg, "正在下载:智慧海事");
    				// 更改文字
                    notification.contentView.setTextViewText(R.id.bartext, l+ "%");
                    // 更改进度条
                    notification.contentView.setProgressBar(R.id.progressBar1, 100,(int)l, false);
                    // 发送消息
                    nm.notify(0, notification);
                    
    //              Intent intent = new Intent();
    //				intent.setAction("cancel");
    //				PendingIntent pendingIntent = PendingIntent.getBroadcast(getApplicationContext(), 0, intent, 0);
    //				notification.contentView.setOnClickPendingIntent(R.id.btnStartStop, pendingIntent);
    				
    			}
    
    			@Override
    			public void onStart() {
    				notification.contentView.setTextViewText(R.id.msg, "开始下载:智慧海事");
    				nm.notify(titleId, notification);
    			}
    			
    		});
    	}
    	
    	
    	public static HttpHandler<File> getHandler(){
    		return httpHandler;
    	}
    	
    	
    	@Override
    	public void onDestroy() {
    		//下载完成时,清楚该通知,自动安装
    		nm.cancel(titleId);
    		System.out.println("UpdateVersionService----onDestroy");
    //		try {
    //			GdmsaecApplication.db.deleteAll(VersionInfo.class);
    //		} catch (DbException e) {
    //			e.printStackTrace();
    //		}
    		super.onDestroy();
    	}
    	
    	@Override
    	public IBinder onBind(Intent intent) {
    		return null;
    	}
    	
    	
    }

    兼容7.0的

    /**
     *
     * @author wenjie
     *	下载新版本的服务类
     */
    public class UpdateVersionService extends Service {
    
    
    	private NotificationManager nm;
    	private NotificationCompat.Builder builder;
    	private Notification notification;
    	//标题标识
    	private int titleId = 0;
    	//安装文件
    	private File updateFile;
    
    	private HttpUtils httpUtils;
    
    	private long initTotal = 0;//文件的总长度
    
    
    	@Override
    	public void onCreate() {
    		super.onCreate();
    
    		httpUtils = new HttpUtils();
    		updateFile = new File(SDCardUtils.getRootDirectory() + "/updateVersion/gdmsaec-app.apk");
    		nm = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
    		builder = new NotificationCompat.Builder(getApplicationContext());
    		notification = builder
    				.setContentTitle("正在下载:智慧海事")
    				.setWhen(System.currentTimeMillis())
    				.setSmallIcon(R.mipmap.ic_launcher)
    				.setOngoing(true)
    				.build();
    	}
    
    	@Override
    	public int onStartCommand(Intent intent, int flags, int startId) {
    		if(updateFile.exists()){
    			updateFile.delete();
    		}
    		Bundle bundle = intent.getExtras();
    		String url = bundle.getString("downloadUrl");
    		nm.notify(titleId, notification);
    		downLoadFile(url);
    		startForeground(titleId, notification);
    		return super.onStartCommand(intent, flags, startId);
    	}
    
    
    	public void downLoadFile(String url){
    
    		httpUtils.download(url,updateFile.getAbsolutePath(), true, false, new RequestCallBack<File>() {
    
    			@Override
    			public void onSuccess(ResponseInfo<File> response) {
    				// 发送消息
    				notification = builder
    						.setContentTitle("下载完成!点击安装")
    						.setWhen(System.currentTimeMillis())
    						.setSmallIcon(R.mipmap.ic_launcher)
    						.build();
    				nm.notify(0, notification);
    				UpdateVersionUtil.collapsingNotification(UpdateVersionService.this);
    				stopSelf();
    				//自动安装新版本
    				Intent installIntent = ApkUtils.getInstallIntent(updateFile);
    				startActivity(installIntent);
    				nm.cancel(titleId);
    			}
    
    			@Override
    			public void onFailure(HttpException error, String msg) {
    //				//网络连接错误
    //				if(error.getExceptionCode() == 0 ){
    //					// 更改文字
    //					notification.contentView.setTextViewText(R.id.msg, "网络异常!请检查网络设置!");
    //				}else if(error.getExceptionCode() == 416){//文件已经下载完毕
    //					// 更改文字
    //					notification.contentView.setTextViewText(R.id.msg, "智慧海事");
    //					// 更改文字
    //					notification.contentView.setTextViewText(R.id.bartext, "检测到新版本已经下载完成,点击即安装!");
    //					// 隐藏进度条
    //					notification.contentView.setViewVisibility(R.id.progressBar1, View.GONE);
    //
    //					Intent intent = ApkUtils.getInstallIntent(updateFile);
    //					PendingIntent pendingIntent = PendingIntent.getActivity(UpdateVersionService.this, 0, intent, 0);
    //					notification.flags = Notification.FLAG_AUTO_CANCEL;//点击通知栏之后 消失
    //					notification.contentIntent  = pendingIntent;//启动指定意图
    //				}
    //				// 发送消息
    //				nm.notify(0, notification);
    				stopSelf();
    				nm.cancel(titleId);
    				ToastUtils.showToast(getApplicationContext() , "下载失败,请检查网络!");
    			}
    
    			@Override
    			public void onLoading(long total, long current, boolean isUploading) {
    				if(initTotal == 0){//说明第一次开始下载
    					initTotal = total;
    				}
    
    				if(initTotal != total){//说明下载过程中暂停过,文件的总长度出现问题  就把初始的文件的长度赋值给他重新计算已经下载的比例
    					total = initTotal;
    				}
    
    				long l = current*100/total;
    //				notification.contentView.setTextViewText(R.id.msg, "正在下载:智慧海事");
    //				// 更改文字
    //				notification.contentView.setTextViewText(R.id.bartext, l+ "%");
    //				// 更改进度条
    //				notification.contentView.setProgressBar(R.id.progressBar1, 100,(int)l, false);
    				// 发送消息
    				notification = builder
    						.setContentTitle("正在下载:智慧海事")
    						.setWhen(System.currentTimeMillis())
    						.setSmallIcon(R.mipmap.ic_launcher)
    						.setContentText((int)l+"%")
    						.setProgress(100,(int)l, false)
    						.setOngoing(true)
    						.build();
    				nm.notify(0, notification);
    
    //              Intent intent = new Intent();
    //				intent.setAction("cancel");
    //				PendingIntent pendingIntent = PendingIntent.getBroadcast(getApplicationContext(), 0, intent, 0);
    //				notification.contentView.setOnClickPendingIntent(R.id.btnStartStop, pendingIntent);
    
    			}
    
    			@Override
    			public void onStart() {
    				notification = builder
    						.setContentTitle("开始下载:智慧海事")
    						.setWhen(System.currentTimeMillis())
    						.setSmallIcon(R.mipmap.ic_launcher)
    						.setOngoing(true)
    						.build();
    				nm.notify(titleId, notification);
    			}
    
    		});
    	}
    
    
    	@Override
    	public void onDestroy() {
    		super.onDestroy();
    	}
    
    	@Override
    	public IBinder onBind(Intent intent) {
    		return null;
    	}
    
    }
    




    5、吐司的工具类
    <pre class="java" name="code">/**
     * Toast工具箱  可防止用户多次点击之后 显示消息的时长太长 
     */
    public class ToastUtils {
    	
    	private static String oldMsg;  
        protected static Toast toast   = null;  
        private static long oneTime=0;  
        private static long twoTime=0;  
        /**
         * 吐出一个显示时间较短的提示
         * @param context 上下文
         * @param s  文本内容
         */
        public static void showToast(Context context, String s){      
            if(toast==null){   
                toast =Toast.makeText(context, s, Toast.LENGTH_SHORT);  
                toast.show();  
                oneTime=System.currentTimeMillis();  
            }else{
                twoTime=System.currentTimeMillis();  
                if(s.equals(oldMsg)){  
                    if(twoTime-oneTime>Toast.LENGTH_SHORT){  
                        toast.show();  
                    }
                }else{  
                    oldMsg = s;  
                    toast.setText(s);  
                    toast.show();  
                }
            }
            oneTime=twoTime;  
        }
    }


    6、获取sdcard根目录

     * 获取SD卡的状态
    	public static String getState(){
    		return Environment.getExternalStorageState();
    	}
    
    	/**
    	 * SD卡是否可用
    	 * @return 只有当SD卡已经安装并且准备好了才返回true
    	 */
    	public static boolean isAvailable(){
    		return getState().equals(Environment.MEDIA_MOUNTED);
    	}
    
    	/**
    	 * 获取SD卡的根目录
    	 * @return null:不存在SD卡
    	 */
    	public static File getRootDirectory(){
    		return isAvailable()?Environment.getExternalStorageDirectory():null;
    	}


     7、版本检测的实体类

    public class VersionInfo implements Serializable{
    	/**
    	 * 
    	 */
    	private static final long serialVersionUID = 1L;
    	private String id;
    	private String	versionName;//版本名
    	private int		versionCode;//版本号
    	private String	versionDesc;//版本描述信息内容
    	private String	downloadUrl;//新版本的下载路径
    	private String versionSize;//版本大小
    	
    	
    	public String getId() {
    		return id;
    	}
    	public void setId(String id) {
    		this.id = id;
    	}
    	public String getVersionSize() {
    		return versionSize;
    	}
    	public void setVersionSize(String versionSize) {
    		this.versionSize = versionSize;
    	}
    	public String getVersionName() {
    		return versionName;
    	}
    	public void setVersionName(String versionName) {
    		this.versionName = versionName;
    	}
    	public int getVersionCode() {
    		return versionCode;
    	}
    	public void setVersionCode(int versionCode) {
    		this.versionCode = versionCode;
    	}
    	public String getVersionDesc() {
    		return versionDesc;
    	}
    	public void setVersionDesc(String versionDesc) {
    		this.versionDesc = versionDesc;
    	}
    	public String getDownloadUrl() {
    		return downloadUrl;
    	}
    	public void setDownloadUrl(String downloadUrl) {
    		this.downloadUrl = downloadUrl;
    	}
    	
    }
    

    8、网络监测
    <pre class="java" name="code">/**
     * 网络检查
     * @author 00
     *
     */
    public class NetworkUtil {
    	/**
    	 * 没有网络
    	 */
    	public static final int NONETWORK = 0;
    	/**
    	 * 当前是wifi连接
    	 */
    	public static final int WIFI = 1;
    	/**
    	 * 不是wifi连接
    	 */
    	public static final int NOWIFI = 2;
    	
    	
    	/**
    	 * 检测当前网络的类型 是否是wifi
    	 * @param context
    	 * @return
    	 */
    	public static int checkedNetWorkType(Context context){
    		if(!checkedNetWork(context)){
    			return NONETWORK;
    		}
    		ConnectivityManager cm = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
    		if(cm.getNetworkInfo(ConnectivityManager.TYPE_WIFI).isConnectedOrConnecting() ){
    			return WIFI;
    		}else{
    			return NOWIFI;
    		}
    	}
    	
    	
    	/**
    	 * 检查是否连接网络
    	 * @param context
    	 * @return
    	 */
    	public static boolean  checkedNetWork(Context context){
    		// 1.获得连接设备管理器
    		ConnectivityManager cm = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
    		if(cm == null) return false;
    		/**
    		 * 获取网络连接对象
    		 */
    		NetworkInfo networkInfo = cm.getActiveNetworkInfo();
    		
    		if(networkInfo == null || !networkInfo.isAvailable()){
    			return false;
    		}
    		return true;
    	}
    }

    9、json解析类
    <pre class="java" name="code">/**
     * json 和 实体类之间的相互转换
     * @author 00
     *
     */
    public class JsonUtil {
    	/**
    	 * 将一个实体对象  转换成一个json字符串  提示对象中可包含集合
    	 * @param t 实体类
    	 * @return
    	 */
    	public static <T> String beanToJson(T t){
    		Gson gson = new Gson();
    		String json = gson.toJson(t);
    		return json;
    	}
    	
    	/**
    	 * 将一个json字符串 转换成一个实体类对象 可包含list
    	 * @param json
    	 * @param t
    	 * @return
    	 */
    	public static <T> T jsonToBean(String json,Class<T> class1) throws InstantiationException, IllegalAccessException{
    		Gson gson = new Gson();
    		T t = class1.newInstance();
    		t=gson.fromJson(json, class1);
    		return t;
    	}
    	
    	/**
    	 * 将json字符串转换成一个json对象
    	 * @param str
    	 * @return
    	 */
    	public static JSONObject stringToJson(String str){
    		try {
    			return new JSONObject(str);
    		} catch (JSONException e) {
    			e.printStackTrace();
    			return null;
    		}
    	}
    	public static String getString(InputStream is){
    		
    		try {
    			ByteArrayOutputStream baos = new ByteArrayOutputStream();
    			
    			byte[] buffer = new byte[1024];
    			int len = -1;
    			while((len = is.read(buffer)) != -1){
    				baos.write(buffer, 0, len);
    			}
    			
    			byte[] byteArray = baos.toByteArray();
    			//String str = new String(byteArray);
    			
    			return new String(byteArray,"utf-8");
    		} catch (IOException e) {
    			e.printStackTrace();
    		}
    		
    		return "";
    	}
    	
    	/**
    	 * 从assert文件夹中读取json文件,然后转化为json对象
    	 * @throws Exception 
    	 */
    	public static JSONObject getJsonDataFromAssets(Context context,String jsonFileName) throws Exception{
    		JSONObject mJsonObj = null;
    		StringBuffer sb = new StringBuffer();
    		InputStream is = context.getAssets().open(jsonFileName);
    		int len = -1;
    		byte[] buf = new byte[1024];
    		while ((len = is.read(buf)) != -1){
    			sb.append(new String(buf, 0, len, "UTF-8"));
    		}
    		is.close();
    		mJsonObj = new JSONObject(sb.toString());
    		return mJsonObj;
    	}
    	
    }

    10、http请求类
    <pre class="java" name="code">/**
     * http  请求工具类
     * @author winfo-wj
     *
     */
    public class HttpRequest {
    	
    	private static HttpUtils http = new HttpUtils();
    	
    	
    	/**
    	 * 请求回调接口
    	 * @author winfo-wj
    	 *
    	 */
    	public interface RequestCallBackListener{
    		/**
    		 * 请求成功 
    		 * @param resultData	服务器返回的结果数据
    		 */
    		public void onSuccess(String resultData);
    		
    		/**
    		 * 请求失败
    		 * @param error	错误信息
    		 */
    		public void onFailure(String error);
    	}
    	
    	
    	
    	/**
    	 * get请求 
    	 * @param url 请求路径
    	 * @param requestCallBackListener 请求回调
    	 */
    	public static void get(String url , final RequestCallBackListener requestCallBackListener){
    		http.configTimeout(1000*10);
    		http.send(HttpMethod.GET, url, new RequestCallBack<String>() {
    
    			@Override
    			public void onSuccess(ResponseInfo<String> response) {
    				requestCallBackListener.onSuccess(response.result);
    			}
    			
    			@Override
    			public void onFailure(HttpException error, String msg) {
    				requestCallBackListener.onFailure(msg);
    			}
    		});
    	}
    	
    	/**
    	 * post请求
    	 * @param url	请求地址
    	 * @param params	请求参数
    	 * @param requestCallBackListener	请求回调
    	 */
    	public static void post(String url ,RequestParams params , final RequestCallBackListener requestCallBackListener){
    		http.configTimeout(1000*10);
    		http.send(HttpMethod.POST, url, params, new RequestCallBack<String>() {
    
    			@Override
    			public void onSuccess(ResponseInfo<String> response) {
    				requestCallBackListener.onSuccess(response.result);
    			}
    			
    			@Override
    			public void onFailure(HttpException error, String msg) {
    				requestCallBackListener.onFailure(msg);
    			}
    		});
    	}
    }

    12、通知栏的布局

    <pre class="html" name="code"><pre class="html" name="code"><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="fill_parent"
        android:orientation="vertical"
        android:layout_height="fill_parent" >
    
        
        <LinearLayout 
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:orientation="horizontal"
            >
    	    <LinearLayout 
    	        android:layout_width="wrap_content"
    	        android:layout_height="wrap_content"
    	        android:orientation="horizontal"
    	        android:layout_gravity="center_vertical"
    	        >
    	        <ImageView 
    	            android:layout_width="40dp"
    	            android:layout_height="40dp"
    	            android:layout_gravity="center"
    	            android:src="@drawable/ic_launcher"
    	            />
    	    </LinearLayout>
    	    
    	    <LinearLayout 
    	        android:layout_width="match_parent"
    	        android:layout_height="wrap_content"
    	        android:orientation="vertical"
    	        android:weightSum="3"
    	        android:paddingLeft="10dp"
    	        android:paddingRight="10dp"
    	        android:layout_gravity="center_vertical"
    	        >
    	        <TextView 
    	            android:id="@+id/msg"
    	            android:text="正在下载:xxx"
    	            android:layout_width="wrap_content"
    	            android:layout_height="wrap_content"
    	            android:textColor="#ffffff"
    	            android:textSize="14sp"
    	            />
    	        <TextView 
    	            android:id="@+id/bartext"
    	            android:layout_width="wrap_content"
    	            android:layout_height="wrap_content"
    	            android:text="0%"
    	            android:textColor="#ffffff"
    	            android:textSize="12sp"
    	            />
    	        <ProgressBar
    	        	android:id="@+id/progressBar1"
    	        	style="?android:attr/progressBarStyleHorizontal"
    	        	android:layout_width="match_parent"
    	        	android:layout_height="5dp" />
    	        
    	        <!-- 
    	        <LinearLayout 
    		        android:layout_width="match_parent"
    		        android:layout_height="wrap_content"
    		        android:orientation="horizontal"
    		        >
    		        <Button 
    		            android:id="@+id/btnStartStop"
    		            android:layout_width="0dp"
    		            android:layout_weight="1"
    		            android:layout_height="25dp"
    		            android:text="暂停"
    		            android:textSize="12sp"
    		            android:textColor="#ffffff"
    		            />
    		        <Button 
    		            android:id="@+id/btnCancel"
    		            android:layout_width="0dp"
    		            android:layout_weight="1"
    		            android:layout_height="25dp"
    		            android:text="取消"
    		            android:textSize="12sp"
    		            android:textColor="#ffffff"
    		            />
    	    	</LinearLayout>
    	         -->
    	    </LinearLayout>
    	    
        </LinearLayout>
        
    </LinearLayout>

    14、按本更新提示的对话框布局文件

    <pre class="html" name="code"><?xml version="1.0" encoding="utf-8"?>
    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        >
    
        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_marginLeft="60dp"
             android:layout_centerInParent="true"
            android:layout_marginRight="60dp"
            android:background="@drawable/dialog_bg"
            android:orientation="vertical" >
    
            <!-- Title -->
    
            <RelativeLayout
                android:layout_width="fill_parent"
                android:layout_height="45dp" >
                <ImageView
                    android:id="@+id/umeng_wifi_indicator"
                    android:layout_width="30dp"
                    android:layout_height="30dp"
                    android:layout_centerVertical="true"
                    android:layout_marginLeft="10dp"
                    android:src="@drawable/ic_launcher" />
    
                <TextView
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:layout_centerInParent="true"
                    android:text="发现新版本"
                    android:textSize="@dimen/normal_text_size"
                    android:textAppearance="?android:attr/textAppearanceLarge"
                    android:textColor="@color/black" />
                
            </RelativeLayout>
    
            <!-- split -->
    
            <View
                android:layout_width="fill_parent"
               	android:layout_height="0.5dp"
                android:layout_marginLeft="10dp"
                android:layout_marginRight="10dp"
                android:background="#d8d8d8" />
            <!-- Content -->
    
            <ScrollView
                android:layout_width="fill_parent"
                android:layout_height="0dp"
                android:padding="10dp"
                android:layout_weight="1" >
    
                <LinearLayout
                    android:layout_width="fill_parent"
                    android:layout_height="wrap_content"
                    android:orientation="vertical" >
    
                    <TextView 
                        android:id="@+id/tv_update_title"
                        android:layout_width="match_parent"
                        android:layout_height="wrap_content"
                        android:text="最新版本:xxxv2.2.1"
                        android:textColor="@color/black" 
                        android:textSize="@dimen/medium_text_size"
                        />
                    
                    <TextView 
                        android:id="@+id/tv_update_msg_size"
                        android:layout_width="match_parent"
                        android:layout_height="wrap_content"
                        android:text="新版本大小:19.07M"
                        android:textSize="@dimen/medium_text_size"
                        android:layout_marginTop="10dp"
                        android:textColor="@color/black" 
                        />
                    
                    <TextView
                        android:id="@+id/tv_update_content"
                        android:layout_width="fill_parent"
                        android:layout_height="wrap_content"
                        android:minHeight="60dp"
                        android:textSize="@dimen/medium_text_size"
                        android:lineSpacingExtra="3dp"
                        android:textColor="@color/black" 
                        />
                </LinearLayout>
            </ScrollView>
            
            <!-- Ignore CheckBox -->
    
            <!-- OK&Cancel Button -->
    
            <LinearLayout
                android:layout_width="fill_parent"
                android:orientation="horizontal"
                android:layout_height="wrap_content" >
    
                <Button
                    android:id="@+id/btn_update_id_cancel"
                    android:layout_width="0dp"
                    android:layout_height="40dp"
                    android:layout_weight="1"
                    android:background="@drawable/dialog_cancel_btn_bg"
                    android:text="以后再说"
                    android:layout_marginLeft="10dp"
                    android:layout_marginRight="5dp"
                    android:layout_marginBottom="10dp"
                    android:textSize="@dimen/normal_text_size"
                    android:textColor="@color/black" />
                
                
                <Button
                    android:id="@+id/btn_update_id_ok"
                    android:layout_width="0dp"
                    android:layout_marginLeft="5dp"
                    android:layout_marginRight="10dp"
                    android:layout_marginBottom="10dp"
                    android:layout_height="40dp"
                    android:layout_weight="1"
                    android:textSize="@dimen/normal_text_size"
                    android:background="@drawable/dialog_ok_btn_bg"
                    android:text="立即更新"
                    android:textColor="@color/white" />
            </LinearLayout>
        </LinearLayout>
    
    </RelativeLayout>
    

    
    


    15、对话框按钮的.9图

     

    16、字体颜色

    <!-- 黑色 -->
        <color name="black">#333333</color>

     

    17、字体大小文件

    <dimen name="title_text_size">18sp</dimen><!-- 标题字体大小 -->
        <dimen name="normal_text_size">16sp</dimen><!-- 通常字体大小 -->
        <dimen name="medium_text_size">14sp</dimen><!-- 中等字体大小 -->
        <dimen name="small_text_size">12sp</dimen><!-- 小号字体大小 -->


     

    展开全文
  • 小米10安卓11稳定版本再次正式推送。IT之家获悉,本次新增超级文档和相机VLOG、AI水印等多项功能。小米表示,本次更新为安卓版本升级,为降低升级风险,建议提前备份个人数据。本次更新启动加载时间相对较长,...

    上周二,小米 10 部分手机推送了基于安卓 11 系统的 MIUI V12.2.2.0.RJBCNXM | 稳定版,大小为 3.6G。但随后小米进行了撤包。小米10的安卓11稳定版本再次正式推送。IT之家获悉,本次新增超级文档和相机VLOG、AI水印等多项功能。

    1383192.html小米表示,本次更新为安卓跨版本升级,为降低升级风险,建议提前备份个人数据。本次更新启动加载时间相对较长,启动后短时间内可能出现微热、微卡等性能、功耗问题,请耐心等待。部分三方应用由于自身未进行版本适配,会影响正常使用,请谨慎升级。

    a5f964c7f44b44b846730c101de27e88.png

    1383192.html下面是更新内容:

    超级文档

    新增悬浮功能面板,支持快捷收起展开。竖屏查看功能丰富,横屏阅读体验最佳

    新增文档 / 表格 / PDF 一键 [导 PDF]功能

    新增文档 / 表格 / PDF [投屏]功能

    新增 PPT/PDF [缩略图]功能,跳转页面更快捷

    新增旋转屏幕提示切换功能

    优化版本 APK 体积和运行时存储空间

    系统

    更新谷歌安全补丁 (2020#10),提升系统安全性

    基于 Android11 深度定制的 MIUI 稳定版发布

    相机

    新增 VLOG 模式新增「故事「节奏」两个模版

    新增 VLOG 模式支持草稿箱功能,可以将当前拍摄进度保存至草稿箱

    新增 AI 水印增加 3 款地点水印与经纬度水印

    优化录像模式 8K 视频功能入口整合到顶部菜单栏中

    优化 VLOG 模式升级为云端下载运行库及模版资源,后续 VLOG 新模版将通过云端推送

    优化新版机型水印

    优化用户调整相机中各功能的变焦倍率后,30 秒内再次打开相机、由相册切换回相机、锁屏界面打开相机时,保持变焦倍率不变

    责任编辑:haq

    展开全文
  • 而就在 ColorOS 11 发布的前些天,华为也为我们带来了新的 EMUI 11 系统,与 ColorOS 11 一个本质上的不同在于,EMUI 11 采用的底层为安卓 10。但众所周知,对于国内厂商来说,「魔改」安卓系统甚至可以说是基本功,...

    OPPO 带着全新的 ColorOS 11 与我们正式见面,这一基于安卓 11 底层深度打造的新系统给我们带来了不少新特性。而就在 ColorOS 11 发布的前些天,华为也为我们带来了新的 EMUI 11 系统,与 ColorOS 11 一个本质上的不同在于,EMUI 11 采用的底层为安卓 10。但众所周知,对于国内厂商来说,「魔改」安卓系统甚至可以说是基本功,那么在「极致强化」状态下的安卓 10 与安卓 11 系统,又有什么差异呢?

    无论是基于安卓 10 的 EMUI 11,还是基于安卓 11 的 ColorOS 11,个性化定制都是这两个系统的一大重要领域。在息屏画面上,EMUI 11 带来了「灭屏显示」,而 ColorOS 11 则带来了「无限息屏」。当然,名字并不是重点,这两者都支持自定义息屏画面效果,同时支持文字或是图案设计。

    276a1535c8a926dfa7725c050294c586.png

    但在细节方面,这两者还是有些差异存在,ColorOS 11 更注重对图案线条的发挥,你可以通过自带的编辑器画出只属于自己的复杂图案,而 EMUI 11 更多的则是通过图案与文字结合,各方面相对更为独立。但从自定义的角度来说,ColorOS 11 支持手绘的形式赋予了用户更多自由度。

    此外,通过分屏做到多任务协同也同样是这两个系统上的类似升级点。在如今手机屏幕越做越大的条件下,如何充分利用屏幕空间显示更多内容,提高效率早已是系统设计的重点。无论是 EMUI 11 或是 ColorOS 11,都能做到开启小窗应用功能,将一个应用浮于上方,并且支持随意移动,ColorOS 11 还有特定的迷你窗将应用挂起在边角,从而更好的完成两个应用之间的对照等工作。

    此外,ColorOS 11 的「闪达窗口」功能还能做到打破不同应用之间的界限,将图片等文件从小窗内直接拉动到另一应用的输入界面上,让手机也能做到类似电脑 PC 端的拖拽操作。

    实际上,这两大系统已经可以算是目前「魔改」安卓底层的两大成功案例,EMUI 11 尽管使用安卓 10 底层,但已经将功能点发挥到极致,而使用安卓 11 的 ColorOS 11,更多的则是面向未来,在满足了目前的各种需求之后,安卓 11 的底层还能让 ColorOS 11 后续拥有更多开发空间,在日后的升级不易受限。 当然,对于用户来说,我们当然愿意看到厂商们提供更为优质的系统体验,我们也不妨期待一下后续这两大系统的新升级了。

    责任编辑:tzh

    展开全文
  • Android各个版本的介绍

    2021-05-28 03:37:07
    一、版本对应的API级别API级别:是对 Android 平台版本提供的框架 API 修订版进行唯一标识的整数值。1 ,Android 4.4 API级别是19;2,Android 5.0API 级别:21;3,Android 5.1 API 级别:22;4,Android 6.0 API ....

    前言:笔者在面试的过程中,已经被问过不下三次,因此在这里分析一下。可能不够详细,请各位大佬多多包涵。

    一、版本对应的API 级别

    API 级别:是对 Android 平台版本提供的框架 API 修订版进行唯一标识的整数值。

    1 ,Android 4.4 API 级别是19;

    2,Android 5.0 API 级别:21;

    3,Android 5.1 API 级别:22;

    4,Android 6.0 API 级别:23;

    5,Android 7.0 API 级别:24;

    6,Android 7.1 API 级别:25;

    7,Android 8.0  API 级别:26;

    8,Android 8.1 API 级别:27;

    9,Android 9  API 级别:28;

    10,Android 10  API 级别:29;

    二、版本变更

    注:只举一些常见的。

    Android 4.4

    1,文件的读写权限,长期对文件进行读写;

    2,增加了webview组件;

    3,打印框架,通过 WLAN、蓝牙或其他服务连接的打印机;

    4,短信内容的提供,允许应用读写设备的短信和彩信;

    5,NFC读取

    6,沉浸式

    7,透明系统状态栏

    8,虚拟机的改变

    Android 5.0

    1,webview更新,增加了安全性和稳定性

    2,录屏功能

    3,camera2

    4,多个网络连接

    5,蓝牙低功耗

    6,NFC增强

    7,ART运行时取代了Dalvik成为平台默认设置

    8,浮动窗口

    Android 6.0

    1,指纹身份认证

    2,蓝牙触控笔并且改进蓝牙低功耗

    3,4K显示

    4,低功耗模式

    5,USB连接授权与其他设备连接

    6,APK验证更为严格

    Android 7.0

    1,增强了低功耗模式,可以监听到用户的行为

    2,屏幕缩放

    3,快速安装app

    4,来电过滤

    Android 8.0

    1,自适应启动图标

    2,增加了webview的安全性和稳定性

    3,多显示器支持,可以一边聊天一边看视频

    4,网络连接和 HTTP(S) 连接

    5,蓝牙,兼容蓝牙5.0版本超过字节约60的限制

    Android 9

    1,WIFI RTT可以室内定位

    2,DEX 文件的 ART 提前转换

    Android 10

    1,可折叠设备

    2,5G网络

    3,保护用户隐私

    4,安全性

    5,ART 优化

    展开全文
  • 安卓11和安卓10有啥区别】安卓手机的底层系统更新一般都意味着新功能的...安卓11和安卓10的区别这两个安卓底层版本之间是正常的迭代关系,带来了诸如聊天气泡,安全隐私,电源菜单等功能,我们一个个详细介绍。...
  • Android 6动态权限开始,Android每次升级版本都会搞些新功能需要兼容,刚好遇到Android 10关于选取图片的问题,所以写篇文章整理一下(突然发现整理的很片面,还有很多其他的要考虑,所以先这样吧...懒得继续了,...
  • 存在的问题:在真机测试时,我的手机安卓9,在使用addNetwork()方法时功能是正常的,当换一个手机的时候(Android10)时发现连接WiFi的功能无法使用,在网上查阅资料,后发现安卓9和安卓10的连接WiFi的方法不一样...
  • 原标题:Android7.1.1 新版本功能不多谷歌今天早些时候正式发布了Android 7.1.1的开发者第二预览版系统,该系统除了扩充支持设备阵容外,其他并没有什么新功能增加。 谷歌发Android7.1.1预览版(图片来自baidu)...
  • Android开发中应用版本更新功能

    万次阅读 2017-03-23 16:14:35
    安卓 程序员要 测试 还得写一个服务端(醉了),这里我就使用nodejs来搞一个本地的服务器来测试下app的版本更新检验。 根据请求的结果,我这里就写一个简单的json { "data" :{ "appname" : "hoolay.apk...
  • 这次小编要为安卓用户带来一款功能强大的root工具“KingRoot”,能够帮助大家大家获取最新安卓10的root权限,帮助大家能够更好的玩转手中的安卓设备,安装第三方应用或者是独立开发者的作品,尝鲜体验更多新功能及...
  • 3、修改adb模块的android.mk文件,在user模式下允许adb功能 system/core/adb/Android.mk 4、设置默认打开adb端口 添加属性persist.sys.usb.config=ptp,adb 如下: device/autochips/ac8257_demo/devi
  • Android 10系统正式版上线啦,如果你是一个安卓机的使用用户,那么更新到的10系统,等你上线开启你的更新操作。无需任何的复杂操作,只需要在手机应用商店点击进行更新,你就可以获得全新上线的新系统体验哟。只需花...
  • 在测试公司项目代码时,测试机能够在设置中与蓝牙设备进行配对,但测试的app中使用`blueadapter.startDiscovery()搜索不到设备,测试机的系统版本Android10.0。 二 解决 查看Android官方文档关于蓝牙的部分:...
  • Android Support Library也对Android 4.0这些增强的无障碍,Android 1.6以上版本,进行了更新,提供支持。鼓励开发人员的目标是使用Support Library,在Android 4.0介绍的更先进的无障碍特性上进行兼容无障碍服务的...
  • 12日上午,华为官方微博宣布,于10月16日在德国慕尼黑发布的新机Mate 10将首发搭载Android8.0操作系统,并将带来更棒的体验。华为放出的预告视频中,还出现了奥利奥图案,而Oreo(奥利奥)正是Android 8.0的命名。其实...
  • 运行之后,每打开一个新的应用,都会自动点击应用里面的控件,简易版按键精灵。 运行之后,每打开一个新的应用,都会自动点击应用里面的控件,简易版按键精灵。
  • Android 各个版本适配及新功能

    千次阅读 2020-08-19 20:32:22
    Android各个版本适配及新功能.xmind下载 Android 4.4 (API19)KITKAT 沉浸式状态栏 WebView webview调试功能 WebView 增加对 https请求限制需要去验证https证书,或者设置忽略所有证书 Android 5.0 (API 21)L 沉浸...
  • 随着科技的发展和进步,网络已经融入到我们的日常生活当中,...安卓系统有着非常悠久的一个发展历史了,从最初代安卓系统安卓1.0诞生,到现在安卓9.0时代,安卓已经走过了十一年的发展历史。相比于苹果的IOS系统,...
  • 最新的Android版本是什么?

    千次阅读 2020-09-28 14:02:44
    Android can be confusing. There are a lot of different versions, and many of them are still running on devices today. Keeping up with the latest version can be a challenge, but fret not—we have you ...
  • 设置 Android 10 SDK

    2021-06-04 07:40:21
    Android 10 是一个主要版本,包含可用于扩展应用的各种特性和功能Android 10 还提供了行为变更(针对以 Android 10 为目标平台的应用和所有应用)以及隐私权变更,有助于延长电池续航时间并提升安全性。要使用 ...
  • 安卓8.1和9.0的主要差别是:流畅度、耗电量、功能等等方面的不同。在手机配置足够的情况下,9.0要比8.1更流畅和省电,它可以同时让后台保持更多APP,每个APP运行的时候更加流畅,其新的智能电量管理功能、暗黑模式让...
  • 原标题:Android版本今年将大更新,迈入10.0时代,新特性曝光时代不曾为谁停留,谷歌将在今年推出Android的重大版本更新,Android将迈入10.0时代,代号是Android Q。 谷歌是在2018年8月7日正式发布了Android 9.0,并...
  • 广告微信支持什么系统?...微信的版本有:5.2.1(Android)、5.2.0.17(iOS)、4.2(Symbian)、5.1.0.0(Windows Phone 8)、1.5(诺基亚S40)、3.0(BlackBerry)、2.0(BlackBerry 10)。微信支持多种语言,支持Wi...
  • Android OS历史版本

    千次阅读 2018-02-19 00:14:01
    文章共约2000字,阅读需要约5分钟说起Android OS,大家都知道是Google的Android,但是Google却不是Android的“亲生父亲”。最初的Android OS,由酷爱机器人的Andy Rubin(安迪鲁宾)所研发。因为酷爱机器人,所以...
  • 近日,一加正式推送Android 10系统,不知道流畅性如何呢?一加官方推特正式宣布Android 10系统已进行阶段性推送,从今天开始一加7和一加7 Pro手机用户将会陆续收到氧OS系统的更新,国内基于Android 10的氢OS将于下月...
  • Android从1.0到11版本特性

    千次阅读 2020-05-08 12:45:28
    Android版本从最早的1.0到已经发布预览版的11,每个版本都有它的特性,本文就带你了解这些特性!
  •  http://www.ifeegoo.com/relationship-between-android-version-and-bluetooth-version.html ...不同版本Android 系统是否有针对不同版本的 Bluetooth 模块提供官方的 API 供开发者调用
  • Android版本差异适配方案(5.0-11.0)

    千次阅读 2019-11-28 15:58:14
    Android版本差异适配方案(5.0-9.0) 一个好的APP最好支持90%设备,由于不同版本系统提供的API可能不同,所以了解不同版本间系统差异很重要,这样才能更好的适配更多的智能设备。你的应用足不足够健壮要看你的应用在...
  •   这是一篇纯新手教学,本人之前没有任何安卓开发经验(尴尬),本文也不涉及任何代码就可以使用一个扫码demo,华为scankit真是新手的福音…… 背景介绍   最近被导师要求做一个购物收费的app,毕设好难呀~ ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 140,484
精华内容 56,193
关键字:

安卓版本10的功能