android 原生的DownloadManager
代码:
public class MainActivity extends Activity {
private DownloadManager downloadManager;
public static final String DOWNLOAD_FOLDER_NAME = "Trinea";
public static final String DOWNLOAD_FILE_NAME = "MeiLiShuo.apk";
public static final String APK_URL = "http://img.meilishuo.net/css/images/AndroidShare/Meilishuo_3.6.1_10006.apk";
public static final String KEY_NAME_DOWNLOAD_ID = "downloadId";
private long downloadId = 0;
private CompleteReceiver completeReceiver;
@TargetApi(Build.VERSION_CODES.HONEYCOMB)
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
init();
findViewById(R.id.button1).setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
File folder = Environment
.getExternalStoragePublicDirectory(DOWNLOAD_FOLDER_NAME);
if (!folder.exists() || !folder.isDirectory()) {
folder.mkdirs();
}
DownloadManager.Request request = new DownloadManager.Request(
Uri.parse(APK_URL));
request.setDestinationInExternalPublicDir(DOWNLOAD_FOLDER_NAME,
DOWNLOAD_FILE_NAME);
request.setTitle("美丽传说");
request.setDescription("meilishuo desc");
request.setNotificationVisibility(DownloadManager.Request.VISIBILITY_VISIBLE_NOTIFY_COMPLETED);
request.setVisibleInDownloadsUi(false);
// request.allowScanningByMediaScanner();
// request.setAllowedNetworkTypes(DownloadManager.Request.NETWORK_WIFI);
// request.setShowRunningNotification(false);
// request.setNotificationVisibility(DownloadManager.Request.VISIBILITY_HIDDEN);
//application/cn.trinea.download.file
request.setMimeType("application/vnd.android.package-archive");
downloadId = downloadManager.enqueue(request);
/** save download id to preferences **/
}
});
}
private void init() {
// TODO Auto-generated method stub
completeReceiver = new CompleteReceiver();
/** register download success broadcast **/
registerReceiver(completeReceiver, new IntentFilter(
DownloadManager.ACTION_DOWNLOAD_COMPLETE));
downloadManager = (DownloadManager) getSystemService(DOWNLOAD_SERVICE);
}
private int getInt(long downloadId, String columnName) {
DownloadManager.Query query = new DownloadManager.Query()
.setFilterById(downloadId);
int result = -1;
Cursor c = null;
try {
c = downloadManager.query(query);
if (c != null && c.moveToFirst()) {
result = c.getInt(c.getColumnIndex(columnName));
}
} finally {
if (c != null) {
c.close();
}
}
return result;
}
@Override
protected void onDestroy() {
super.onDestroy();
unregisterReceiver(completeReceiver);
}
class CompleteReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
/**
* get the id of download which have download success, if the id is
* my id and it's status is successful, then install it
**/
long completeDownloadId = intent.getLongExtra(
DownloadManager.EXTRA_DOWNLOAD_ID, -1);
if (completeDownloadId == downloadId) {
// if download successful, install apk
// if (downloadManagerPro.getStatusById(downloadId) ==
// DownloadManager.STATUS_SUCCESSFUL) {
if (getInt(downloadId, DownloadManager.COLUMN_STATUS) == DownloadManager.STATUS_SUCCESSFUL) {
String apkFilePath = new StringBuilder(Environment
.getExternalStorageDirectory().getAbsolutePath())
.append(File.separator)
.append(DOWNLOAD_FOLDER_NAME)
.append(File.separator).append(DOWNLOAD_FILE_NAME)
.toString();
install(context, apkFilePath);
}
}
}
};
/**
* install app
*
* @param context
* @param filePath
* @return whether apk exist
*/
public static boolean install(Context context, String filePath) {
Intent i = new Intent(Intent.ACTION_VIEW);
File file = new File(filePath);
if (file != null && file.length() > 0 && file.exists() && file.isFile()) {
i.setDataAndType(Uri.parse("file://" + filePath),
"application/vnd.android.package-archive");
i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
context.startActivity(i);
return true;
}
return false;
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
}
清单文件里的权限:
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.BROADCAST_STICKY" />
<uses-permission android:name="android.permission.DOWNLOAD_WITHOUT_NOTIFICATION" />
但是在做系统适配的时会出问题,上面的这种不支持低版本的,所以自己写service来后台更新
/**
* 更新apk
*
* @author jian.zhou test
*/
@SuppressLint("HandlerLeak")
public class UpdateService extends Service {
private static final int DOWN_OK = 1;
private static final int DOWN_ERROR = 0;
private String app_name;
private NotificationManager notificationManager;
private PendingIntent pendingIntent;
private int notification_id = 0;
protected FinalHttp finalHttp; @Override
public IBinder onBind(Intent arg0) {
return null;
} @Override
public int onStartCommand(Intent intent, int flags, int startId) {
finalHttp = new FinalHttp();
app_name=intent.getStringExtra("app_name");
createNotification();
createThread();
return super.onStartCommand(intent, flags, startId); } Handler handler = new Handler() {
@SuppressWarnings("deprecation")
@Override
public void handleMessage(Message msg) {
switch (msg.what) {
case DOWN_OK:
Uri uri = Uri.fromFile(new File(FileUtlis.getSDKPath()
+ app_name));
Intent intent = new Intent(Intent.ACTION_VIEW);
intent.setDataAndType(uri,
"application/vnd.android.package-archive");
pendingIntent = PendingIntent.getActivity(UpdateService.this,
0, intent, 0);
contentViews.setTextViewText(R.id.notificationTitle,
"下载完成!点击安装");
mBuilder.setContentIntent(pendingIntent);
notificationManager.notify(notification_id, mBuilder.build());
stopService(new Intent("mmdops.services.UpdateService"));
break;
case DOWN_ERROR:
contentViews.setTextViewText(R.id.notificationTitle, "下载失败!");
notificationManager.notify(notification_id, mBuilder.build());
break; default:
stopService(new Intent("mmdops.services.UpdateService"));
break;
}
}
}; /***
* 开线程下载
*/
public void createThread() {
String path = FileUtlis.createFile(app_name);
Logger.e("PATH---->"+path);
finalHttp.download(Cants.HTTP_DOWN_APK, path, new AjaxCallBack<File>() { @Override
public void onStart() {
// TODO Auto-generated method stub
super.onStart();
Logger.e("----------->下载开始!");
} @Override
public void onLoading(long count, long current) {
// TODO Auto-generated method stub
super.onLoading(count, current);
Logger.e("----------->下载...");
contentViews.setProgressBar(R.id.notificationProgress,
(int) count, (int) current, false);
// show_view
notificationManager.notify(notification_id, mBuilder.build());
} @Override
public void onSuccess(File t) {
// TODO Auto-generated method stub
super.onSuccess(t);
Logger.e("----------->下载onSuccess!");
handler.obtainMessage(DOWN_OK).sendToTarget();
} @Override
public void onFailure(Throwable t, int errorNo, String strMsg) {
// TODO Auto-generated method stub
super.onFailure(t, errorNo, strMsg);
handler.obtainMessage(DOWN_ERROR).sendToTarget();
}
});
} /***
* 创建通知栏
*/
private RemoteViews contentViews;
private NotificationCompat.Builder mBuilder; public void createNotification() { contentViews = new RemoteViews(getPackageName(),
R.layout.notification_item);
contentViews.setTextViewText(R.id.notificationTitle, "正在下载");
contentViews.setProgressBar(R.id.notificationProgress, 100, 0, false); Intent intent = new Intent(this, LoginActivity.class);
pendingIntent = PendingIntent.getActivity(this, 0, intent,
PendingIntent.FLAG_CANCEL_CURRENT);
mBuilder = new NotificationCompat.Builder(this).setSmallIcon(
R.drawable.logo_jm).setTicker("后台更新中");
mBuilder.setAutoCancel(true); mBuilder.setContentIntent(pendingIntent);
mBuilder.setContent(contentViews);
mBuilder.setAutoCancel(true); notificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
notificationManager.notify(notification_id, mBuilder.build());
} }
android 原生的DownloadManager的更多相关文章
- 拓展 Android 原生 CountDownTimer 倒计时
拓展 Android 原生 CountDownTimer 倒计时 [TOC] CountDownTimer 在系统的CountDownTimer上进行的修改,主要是拓展了功能,当然也保留了系统默认的模 ...
- Android原生json和fastjson的简单使用
android原生操作json数据 主要是两个类 JSONObject 操作对象 JONSArray操作json数组 对象转json //创建学生对象 Student student=new ...
- Android原生游戏开发:使用JustWeEngine开发微信打飞机
使用JustWeEngine开发微信打飞机: 作者博客: 博客园 引擎地址:JustWeEngine 示例代码:EngineDemo JustWeEngine? JustWeEngine是托管在Git ...
- android原生ExpandableListView
android原生可扩展ExpandableListView就是可以伸缩的listView,一条标题下面有多条内容. 这个list的adapter对的数据要求与普通ListView的数据要求也有一些差 ...
- [Android Pro] android 4.4 Android原生权限管理:AppOps
reference : http://m.blog.csdn.net/blog/langzxz/45308199 reference : http://blog.csdn.net/hyhyl1990/ ...
- 【android原生应用】之闹钟应用搭起篇
由于工作原因接触android开发一段时间了,对于开发有了一些了解,于是萌生了搭起android原生应用进行分析和学习的想法.先从闹钟应用开始吧. 1.首先要下载原生应用,原生应用在原生系统里面(当然 ...
- PhoneGap或者Cordova框架下实现Html5中JS调用Android原生代码
PhoneGap或者Cordova框架下实现Html5中JS调用Android原生代码 看看新闻网>看引擎>开源产品 0人收藏此文章, 发表于8小时前(2013-09-06 00:39) ...
- Android 原生listview item伸展收缩效果
Android原生listview做的一个item的伸缩效果.*永远不要让你老大有机会改需求 package com.example.yunkanglast; import java.io.Seria ...
- Android原生APP内分享
Android原生APP内分享,可实现数据分享以及assets文件夹分享及私有文件分享 项目地址:https://github.com/json-pu/AndroidAppShare.git
随机推荐
- angular项目——小小记事本2
一,路由的规划. 需要模拟的页面有三个:all,active,conplete. 首先,写好铺垫需要的各种东西,重要的组件的引用等—— 这里我们会将index.html设为主页,将body.html加 ...
- Linux - CentOS6.5服务器搭建与初始化配置详解(下)
传送带:Linux - CentOS6.5服务器搭建与初始化配置详解(上) 继续接着上面的安装,安装完后会出现下面界面 点击reboot重启 重启后可以看到下面的tty终端界面 因为这就是最小化安装 ...
- SpringMVC 学习-如何搭配使用 Velocity 页面模板
一.快速搭建 Velocity 框架 1. 加入所需 Jar 包 <dependency> <groupId>org.apache.velocity</groupId&g ...
- storage size of 'xxx' isn't known问题出现的可能原因之一
storage size of 'value' isn't known问题出现的可能原因之一 有可能是头文件没有包含起来,所以会出现这种问题可以从以下几个方面来查找原因:1.若是结构体类型,类型是否写 ...
- 我的定时关机程序(MFC实现) .
原理: 利用定时器去检查,如输入的是多少分钟后关机,就根据输入的分钟数产生一个COUNT计数器,计数器一直递减,直到1,然后执行关机.如输入的是几时几分关机,那么定时器会每次都检查系统的时间和你输入的 ...
- vhost.sh 源代码,认真看哦
#!/bin/bash # # Web Server Install Script # Created by wdlinux QQ:12571192 # Url:http://www.wdlinux. ...
- apt-get 总结
转自: apt-get 总结 1.apt-get install <package_name> install a new package. 2.apt-get build-dep < ...
- hdu_1181_变形课(dfs)
题目连接:http://acm.hdu.edu.cn/showproblem.php?pid=1181 题意:中文题,不解释 题解:直接DFS #include<cstdio> #incl ...
- C# WebBrowser函数互相调用
在使用C#开发winform程序过程中,我们经常会碰到嵌入了一个WebBrowser的浏览器控件.很多时候,我们需要在程序里控制网页的显示方式,或者调用网页当中的某个JS函数,反过来,也有可能网页也需 ...
- android view构造函数研究
上周遇到了SurfaceView的constructor的问题,周末决定略微细致地研究一下这个令人发指的玩意. SurfaceView是View的子类,与View一样有三个const ...