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
随机推荐
- Gentoo安装详解(三)-- 配置系统
配置系统 系统信息: 文件系统信息: 创建/etc/fstab nano -w /etc/fstab 网络信息: Host name, Domainname, etc nano -w /etc/con ...
- for、while循环的洪荒之力
在python里,如果说print语句是用得最多的话,那么,要我说,除了for语句,谁都不敢认老二. 下面,让我们来看看for语句能搞出什么花样 1. 计时(无限次数) 说到计时,我们先来试下显示当前 ...
- ThinkPHP框架基础
ThinkPHP 一.php框架基础介绍 真实项目开发步骤: 多人同时开发项目,协作开发项目.分工合理.效率有提高(代码风格不一样.分工不好) 测试阶段 上线运行 对项目进行维护.修改.升级(单个人维 ...
- 第1章 初识java----Java简介
1.Java最初的名字是OAK,是咖啡的意思,在1995年被重命名为Java. ●Java编程语言,即语法. ●Java文件格式,即各种文件夹.文件的后缀. ●Java虚拟机(JVM),即处理*.cl ...
- c题 Registration system
Description A new e-mail service "Berlandesk" is going to be opened in Berland in the near ...
- libPods.a 无法找到的解决方法
http://stackoverflow.com/questions/9863836/library-not-found-for-lpods To be clear for newbies out t ...
- 域名、网站名、url的定义
网址:http://jingyan.baidu.com/article/2c8c281df0afd00008252aa7.html
- mac xmind快捷键
tab:新建分支 command +z : 撤销 command + "+":放大 command + "-":缩小 shift + enter : 文字换行
- ubuntu14.04 安装 tensorflow
如果内容侵权的话,联系我,我会立马删了的-因为参考的太多了,如果一一联系再等回复,战线太长了--蟹蟹给我贡献技术源泉的作者们- 最近准备从理论和实验两个方面学习深度学习,所以,前面装好了Theano环 ...
- C#中泛型默认关键字(default)详解
我们在泛型类和泛型方法中产生的一个问题是,在预先未知以下情况时,如何将默认值分配给参数化类型 T:(T 是引用类型还是值类型?)对此我们将如何处理? C#代码实例: /// <summary&g ...