binbinyang---Android自动检测更新功能的实现--杨彬
来源:互联网 发布:犀牛o2o源码 编辑:程序博客网 时间:2024/06/06 17:07
今天来说说 安卓开发中任何APP都会要用到的升级 更新的问题
首先写了一个 在通知栏弹出 一个简单的 带有图片.文字的 更新提示
public class MainActivity extends Activity implements OnClickListener{public static final int NOTIFICATION_ID = 24;private Button but;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);but = (Button)findViewById(R.id.but);but.setOnClickListener(this);}@Overridepublic void onClick(View v) {// TODO Auto-generated method stubswitch (v.getId()) {case R.id.but:Builder builder = new NotificationCompat.Builder(MainActivity.this);builder.setSmallIcon(R.drawable.ic_launcher);builder.setContentTitle("下载");builder.setContentText("正在下载");Notification notification= builder.build();NotificationManager manager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);/** * id NOTIFICATION_ID通过这个ID 来更新 */manager.notify(NOTIFICATION_ID,notification);break;default:break;}} }
下面是关于友盟---自动更新升级下载的步骤
1.集成过程客户端集成
2首先到友盟官网下载更新的SDK,复制jar包到目标项目中的libs目录:
3. 配置AndroidManifest.xml
android.permission.WRITE_EXTERNAL_STORAGE
权限允许将下载的apk保存到sd卡中。android.permission.ACCESS_NETWORK_STATE
权限允许检查网络状态,从而根据不同网络环境决定何种下载策略,务必添加该权限。
3.2 添加APPKEY和渠道到<application>
标签下: (如果已经集成了统计SDK等友盟其他服务,不需要重复添加APPKEY)
<meta-data android:value="YOUR APP KEY" android:name="UMENG_APPKEY"/><meta-data android:value="Channel ID" android:name="UMENG_CHANNEL"/>
UMENG_APPKEY:用来定位该应用的唯一性,用您该应用的UMENG APPKEY,替换value中的"YOUR APP KEY"。
UMENG_CHANNEL:用来标注应用推广渠道,不同渠道可以上传不同更新包,您可以使用20位以内的英文和数字为渠道定名,替换value中的"Channel ID"。如果不改动,将代表默认渠道。(特别提示:如果需要使用友盟自动更新多渠道更新,必须先集成友盟统计SDK)
渠道ID
请参考第5节如何上传APK。
3.3 添加Service和Activity到<application>
标签下: (请注意:v2.4的SDK中,对话框改为Activity实现)
注意
com.umeng包名可能有变,如果不能下载,请检查包名,替换成正确的包名。
<service android:name="com.umeng.update.net.DownloadingService" android:process=":DownloadingService" ></service><activity android:name="com.umeng.update.UpdateDialogActivity" android:theme="@android:style/Theme.Translucent.NoTitleBar" ></activity>
4.调用接口
<pre name="code" class="html">public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
UmengUpdateAgent.update(this);
}
5.上传最新的APK
<h2 id="1_5" style="box-sizing: border-box; font-family: 'Helvetica Neue', Helvetica, 'Microsoft Yahei', Arial, sans-serif; font-weight: normal; line-height: 1.1; color: rgb(62, 62, 62); margin: 1em 0px 0.25em; font-size: 24px; padding: 0.5em; text-align: justify;"> <img src="http://img.blog.csdn.net/20160423190619605?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="" /><img src="http://img.blog.csdn.net/20160423190625855?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="" /></h2>
public class MainActivity extends Activity implements OnClickListener {//public static final int NOTIFICATION_ID = 24;private Button but;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);UmengUpdateAgent.update(this);}
如果是自己写一个 升级 跟检测是否当前是最新版本
public class UpdateManager {private ProgressBar mpProgressBar;private Dialog mDownloadDialog;private String mSavePath;private int mProgress;// 进度条值private boolean mIsCancel = false;private static final int DOWNLOADING = 1;private static final int DOWNLOAD_FINISH = 2;private static final String PATH = "http://192.168.0.103/autoupdate/version.html";private String mVersion_code;private String mVersion_name;private String mVersion_desc;private String mVersion_path;private Context mContext;public UpdateManager(Context context) {mContext = context;}private Handler mGetVersionHandler = new Handler() {public void handleMessage(Message msg) {JSONObject jsonObject = (JSONObject) msg.obj;// Toast.makeText(mContext, "出错了" + jsonObject.toString(),// 1).show();System.out.println(jsonObject.toString() + "==========");try {mVersion_code = jsonObject.getString("version_code");mVersion_name = jsonObject.getString("version_name");mVersion_desc = jsonObject.getString("version_desc");mVersion_path = jsonObject.getString("version_path");if (isUpdate()) {Toast.makeText(mContext, "需要更新", Toast.LENGTH_LONG).show();// 需要更新 显示要更新的提示对话框showNoticeDialog();} else {Toast.makeText(mContext, "不需要更新", Toast.LENGTH_LONG).show();}} catch (Exception e) {// TODO: handle exception}};};private Handler mUpdateProgressHandler = new Handler() {public void handleMessage(Message msg) {switch (msg.what) {case DOWNLOADING:mpProgressBar.setProgress(mProgress);break;case DOWNLOAD_FINISH:// 隐藏 销毁 下载对话框mDownloadDialog.dismiss();// 安装本地apk文件break;default:break;}};};/* * 检测软件是否需要更新 */public void checkUpdate() {RequestQueue requestQueue = Volley.newRequestQueue(mContext);JsonObjectRequest request = new JsonObjectRequest(PATH, null,new Listener<JSONObject>() {@Overridepublic void onResponse(JSONObject jsonObject) {Message msg = Message.obtain();msg.obj = jsonObject;mGetVersionHandler.sendMessage(msg);}}, new Response.ErrorListener() {@Overridepublic void onErrorResponse(VolleyError arg0) {// TODO Auto-generated method stub// Toast.makeText(mContext, "出错了" + arg0.toString(), 1)// .show();System.out.println(arg0.toString() + "bbbbbbbbbbb");}});requestQueue.add(request);}/* * 与本地版本比较判断是否需要更新 */protected boolean isUpdate() {int serverVersion = Integer.parseInt(mVersion_code);int localVersion = 1;/** * 拿到本地的包名 */try {localVersion = mContext.getPackageManager().getPackageInfo("com.example.notification", 0).versionCode;} catch (NameNotFoundException e) {// TODO Auto-generated catch blocke.printStackTrace();}if (serverVersion > localVersion)return true;elsereturn false;}/* * 有更新时显示提示对话框 */protected void showNoticeDialog() {AlertDialog.Builder builder = new Builder(mContext);builder.setTitle("提示");String message = "软件有更新,需要下载吗\n" + mVersion_desc;builder.setMessage(message);/** * 确认的那个按钮 */builder.setPositiveButton("更新", new OnClickListener() {@Overridepublic void onClick(DialogInterface dialog, int which) {// 隐藏当前对话框dialog.dismiss();// 显示下载的对话框showDownloadDialog();}});/** * 取消的按钮 */builder.setNegativeButton("取消", new OnClickListener() {@Overridepublic void onClick(DialogInterface dialog, int which) {Toast.makeText(mContext, "取消", 1).show();// 隐藏当前对话框dialog.dismiss();}});builder.create().show();}/* * 显示正在下载对话框 */protected void showDownloadDialog() {AlertDialog.Builder builder = new Builder(mContext);View view = LayoutInflater.from(mContext).inflate(R.layout.dialog_progress, null);builder.setTitle("正在下载");mpProgressBar = (ProgressBar) view.findViewById(R.id.prog);builder.setView(view);builder.setNegativeButton("取消", new OnClickListener() {@Overridepublic void onClick(DialogInterface dialog, int which) {// TODO Auto-generated method stub// 隐藏对话框dialog.dismiss();// 设置下载状态为取消}});mDownloadDialog = builder.create();// 创建对话框mDownloadDialog.show();// 下载文件downloadAPK();}/* * 开启新线程下载文件 */private void downloadAPK() {new Thread(new Runnable() {@Overridepublic void run() {try {if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) {String sdPath = Environment.getExternalStorageDirectory() + "/";mSavePath = sdPath + "jikedownload";File dir = new File(mSavePath);if (!dir.exists())dir.mkdir();// 下载文件HttpURLConnection conn = (HttpURLConnection) new URL(mVersion_path).openConnection();conn.connect();InputStream is = conn.getInputStream();int length = conn.getContentLength();File apkFile = new File(mSavePath, mVersion_name);FileOutputStream fos = new FileOutputStream(apkFile);int count = 0;byte[] buffer = new byte[1024];while (!mIsCancel) {int numread = is.read(buffer);count += numread;// 计算进度条的当前位置mProgress = (int) (((float) count / length) * 1);// 更新进度条mUpdateProgressHandler.sendEmptyMessage(DOWNLOADING);// 下载完成if (numread < 0) {mUpdateProgressHandler.sendEmptyMessage(DOWNLOAD_FINISH);break;}fos.write(buffer, 0, numread);}fos.close();is.close();}} catch (Exception e) {e.printStackTrace();}}}).start();}/* * 下载到本地后执行安装 */protected void installAPK() {}}
0 0
- binbinyang---Android自动检测更新功能的实现--杨彬
- Android 自动检测更新功能的实现
- 实现自动检测更新功能
- Android自动检测更新功能
- binbinyang---Android自动检测版本及自动升级
- iOS app自动检测版本更新的功能
- iOS程序自动检测更新的实现
- iOS程序自动检测更新的实现
- iOS程序自动检测更新的实现
- iOS程序自动检测更新的实现
- iOS程序自动检测AppStore更新的实现
- iOS程序自动检测更新的实现
- Android自动检测更新
- Android客户端apk自动检测更新自动下载自动安装的实现方法
- 轻松实现APP自动检测更新
- Android -- 应用自动检测更新代码
- Android应用更新自动检测下载
- Android 自动检测更新apk版本
- WebService是什么?
- 博客迁移到github
- 判断app是否是第一次进入
- yii2 使用心得之表单及表单的类设置
- Linux命令行下快捷键
- binbinyang---Android自动检测更新功能的实现--杨彬
- ACM2-1002
- JS闭包及内存泄露
- 易语言学习第十一课
- CString用法
- 有符号十六进制转十进制 c++
- [BZOJ1467]Pku3243 clever Y(扩展BSGS)
- 字符串反转引发的char str[]="abc"和char *str="abc"思考
- $(document).ready()