`

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

 
阅读更多

这一篇是对上一篇《Android学习系列--App自动更新之通知栏下载》的补充,因此只是以点为要,点到为止。
1.内部存储

出于考虑到用户可能禁掉了SDCard或者电脑暂时插在电脑上且为磁盘连接状态等等,对于这么个情况下,我们应该也要保证我们的程序也是能正常的运行。所以我们要考虑内部存储。
我暂时把内部存储定在/data/data/xxxxxappxxxx/files目录,核心代码如下:


 //创建目录和文件 
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系统的权限在作怪。在你执行之前,加上如下核心代码:


 String cmd = "chmod +x " +updateFile.getPath(); 
try { 
    Runtime.getRuntime().exec(cmd); 
} catch (IOException e) { 
    e.printStackTrace(); 
} 


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


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


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


 <?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> 


开始下载:


 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%"); 


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

 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); 


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


 //点击安装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); 


效果图如下:
如果你喜欢的话,请推荐一下,谢谢大家的支持!

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics