Android学习系列(3)--App自动更新之自定义进度视图和内部存储

这一篇是对上一篇《Android学习系列(2)--App自动更新之通知栏下载》的补充,因此只是以点为要,点到为止。
1.内部存储
    出于考虑到用户可能禁掉了SDCard或者电脑暂时插在电脑上且为磁盘连接状态等等,对于这么个情况下,我们应该也要保证我们的程序也是能正常的运行。所以我们要考虑内部存储。
    我暂时把内部存储定在/data/data/xxxxxappxxxx/files目录,核心代码如下:

1
2
3
4
5
6
7
8
//创建目录和文件
if (android.os.Environment.MEDIA_MOUNTED.equals(android.os.Environment.getExternalStorageState())){
     updateDir = new File(Environment.getExternalStorageDirectory(),Global.downloadDir);
} else {
     //files目录
     updateDir = getFilesDir();
}
updateFile = new File(updateDir.getPath(),getResources().getString(titleId)+ ".apk" );

 2.内部存储的权限
  一起都运行的正常,但是当我们帮下下来的apk文件执行运行操作的时候,确提示如下,
 
    "解析包错误"??其实你下载的文件并不一定就是坏的或者错误的,也可能是android系统的权限在作怪。在你执行之前,加上如下核心代码:

1
2
3
4
5
6
String cmd = "chmod +x " +updateFile.getPath();
try {
     Runtime.getRuntime().exec(cmd);
} catch (IOException e) {
     e.printStackTrace();
}

3.通知栏显示进度条组件的一个bug。
    在通知栏设置进度条的可见性,会无缘无故的崩溃。

1
2
3
//下面一句是没有语法错误的,但是会导致程序出错
//为了解决这个问题,后面我们会再progressView外面包裹一层LinearLayout来控制可见性
updateNotification.contentView.setViewVisibility(progressViewID, View.GONE);

4.自定义进度条显示视图。
    布局文件updata_nitification.xml:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
<? xml version="1.0" encoding="utf-8"?>
< LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
     android:layout_width="fill_parent"
     android:layout_height="fill_parent"
     android:orientation="vertical"
     android:layout_weight="2"
     android:paddingLeft="5dip">
     < LinearLayout android:layout_width="fill_parent"
         android:layout_height="fill_parent"
         android:gravity="left|center_vertical"
         android:orientation="horizontal"
         android:layout_weight="1"> 
         < ImageView android:src="@drawable/icon"
             android:layout_width="24dip"
             android:layout_height="fill_parent"
             android:scaleType="fitCenter"/>
         < TextView android:layout_width="wrap_content"
             android:layout_height="wrap_content"
             android:text="@string/app_name"
             android:textColor="#000000"
             android:paddingLeft="5dip"
             android:textSize="16dip"/>
     </ LinearLayout >
     < LinearLayout android:layout_width="fill_parent"
         android:layout_height="fill_parent"
         android:gravity="left"
         android:orientation="horizontal"
         android:layout_weight="1"> 
         < TextView android:id="@+id/update_notification_progresstext"
             android:layout_width="wrap_content"
             android:layout_height="wrap_content"
             android:textColor="#8F8F8F"
             android:textSize="14dip"/>
             < LinearLayout android:id="@+id/update_notification_progressblock"
             android:layout_width="fill_parent"
             android:layout_height="wrap_content"
             android:orientation="horizontal">
             < ProgressBar android:id="@+id/update_notification_progressbar"
                 android:layout_width="fill_parent"
                 android:layout_height="wrap_content"
                 style="?android:attr/progressBarStyleHorizontal"/>
             </ LinearLayout >
     </ LinearLayout >
</ LinearLayout >

    开始下载:

1
2
3
updateNotification.contentIntent = updatePendingIntent;
updateNotification.contentView.setProgressBar(com.cnblogs.tianxia.subway.R.id.update_notification_progressbar, 100 , 0 , false );
updateNotification.contentView.setTextViewText(com.cnblogs.tianxia.subway.R.id.update_notification_progresstext, "0%" );

    正在下载,显示下载进度条:

1
2
3
updateNotification.contentView.setProgressBar(com.cnblogs.tianxia.subway.R.id.update_notification_progressbar, 100 , ( int )(totalSize* 100 /updateTotalSize), false );
updateNotification.contentView.setTextViewText(com.cnblogs.tianxia.subway.R.id.update_notification_progresstext, ( int )(totalSize* 100 /updateTotalSize)+ "%" );
updateNotificationManager.notify( 0 , updateNotification);

    下载完成,点击可以安装:

1
2
3
4
5
6
7
8
9
10
11
//点击安装PendingIntent
Uri uri = Uri.fromFile(updateFile);
Intent installIntent = new Intent(Intent.ACTION_VIEW);
installIntent.setDataAndType(uri, "application/vnd.android.package-archive" );
updatePendingIntent = PendingIntent.getActivity(UpdateService. this , 0 , installIntent, 0 );
 
updateNotification.defaults = Notification.DEFAULT_SOUND; //铃声提醒
updateNotification.contentIntent = updatePendingIntent; //安装界面
updateNotification.contentView.setViewVisibility(com.cnblogs.tianxia.subway.R.id.update_notification_progressblock, View.GONE);
updateNotification.contentView.setTextViewText(com.cnblogs.tianxia.subway.R.id.update_notification_progresstext, "下载完成,点击安装!" );
updateNotificationManager.notify( 0 , updateNotification);
  效果图如下:
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值