編輯:關於Android編程
[java]
/**
*
* 版本檢測,自動更新
* 1.通過Url檢測更新 2.下載並安裝更新 3.刪除臨時路徑
*
*/
public class Update {
// 調用更新的Activity
public Activity activity = null;
// 當前版本號
public int versionCode = 0;
// 當前版本名稱
public String versionName = "";
// 控制台信息標識
private static final String TAG = "AutoUpdate";
// 文件當前路徑
private String currentFilePath = "";
// 安裝包文件臨時路徑
private String currentTempFilePath = "";
// 獲得文件擴展名字符串
private String fileEx = "";
// 獲得文件名字符串
private String fileNa = "";
// 服務器地址
private String strURL = "http://127.0.0.1:8080/ApiDemos.apk";
private ProgressDialog dialog;
/**
*
* 構造方法,獲得當前版本信息
*
*
* @param activity
*/
public Update(Activity activity) {
this.activity = activity;
// 獲得當前版本
getCurrentVersion();
}
/**
*
* 檢測更新
*/
public void check() {
// 檢測網絡
if (isNetworkAvailable(this.activity) == false) {
return;
}
// 如果網絡可用,檢測到新版本
if (true) {
// 彈出對話框,選擇是否需要更新版本
showUpdateDialog();
}
}
/**
*
* 檢測是否有可用網絡
*
*
* @param context
*
* @return 網絡連接狀態
*/
public static boolean isNetworkAvailable(Context context) {
try {
ConnectivityManager cm = (ConnectivityManager) context
.getSystemService(Context.CONNECTIVITY_SERVICE);
// 獲取網絡信息
NetworkInfo info = cm.getActiveNetworkInfo();
// 返回檢測的網絡狀態
return (info != null && info.isConnected());
} catch (Exception e) {
e.printStackTrace();
return false;
}
}
/**
*
* 彈出對話框,選擇是否需要更新版本
*/
public void showUpdateDialog() {
@SuppressWarnings("unused")
AlertDialog alert = new AlertDialog.Builder(this.activity)
.setTitle("新版本").setIcon(R.drawable.ic_launcher)
.setMessage("是否更新?")
.setPositiveButton("是", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
// 通過地址下載文件
downloadTheFile(strURL);
// 顯示更新狀態,進度條
showWaitDialog();
}
})
.setNegativeButton("否", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
dialog.cancel();
}
}).show();
}
/**
*
* 顯示更新狀態,進度條
*/
public void showWaitDialog() {
dialog = new ProgressDialog(activity);
dialog.setMessage("正在更新,請稍候...");
dialog.setIndeterminate(true);
dialog.setCancelable(true);
dialog.show();
}
/**
*
* 獲得當前版本信息
*/
public void getCurrentVersion() {
try {
// 獲取應用包信息
PackageInfo info = activity.getPackageManager().getPackageInfo(
activity.getPackageName(), 0);
this.versionCode = info.versionCode;
this.versionName = info.versionName;
} catch (NameNotFoundException e) {
e.printStackTrace();
}
}
/**
*
* 截取文件名稱並執行下載
*
*
* @param strPath
*/
private void downloadTheFile(final String strPath) {
// 獲得文件文件擴展名字符串
fileEx = strURL.substring(strURL.lastIndexOf(".") + 1, strURL.length())
.toLowerCase();
// 獲得文件文件名字符串
fileNa = strURL.substring(strURL.lastIndexOf("/") + 1,
strURL.lastIndexOf("."));
try {
if (strPath.equals(currentFilePath)) {
doDownloadTheFile(strPath);
}
currentFilePath = strPath;
new Thread(new Runnable() {
@Override
public void run() {
// TODO Auto-generated method stub
try {
// 執行下載
doDownloadTheFile(strPath);
} catch (Exception e) {
Log.e(TAG, e.getMessage(), e);
}
}
}).start();
} catch (Exception e) {
e.printStackTrace();
}
}
/**
*
* 執行新版本進行下載,並安裝
*
*
* @param strPath
*
* @throws Exception
*/
private void doDownloadTheFile(String strPath) throws Exception {
Log.i(TAG, "getDataSource()");
// 判斷strPath是否為網絡地址
if (!URLUtil.isNetworkUrl(strPath)) {
Log.i(TAG, "服務器地址錯誤!");
} else {
URL myURL = new URL(strPath);
URLConnection conn = myURL.openConnection();
conn.connect();
InputStream is = conn.getInputStream();
if (is == null) {
throw new RuntimeException("stream is null");
}
// 生成一個臨時文件
File myTempFile = File.createTempFile(fileNa, "." + fileEx);
// 安裝包文件臨時路徑
currentTempFilePath = myTempFile.getAbsolutePath();
FileOutputStream fos = new FileOutputStream(myTempFile);
byte buf[] = new byte[128];
do {
int numread = is.read(buf);
if (numread <= 0) {
break;
}
fos.write(buf, 0, numread);
} while (true);
Log.i(TAG, "getDataSource() Download ok...");
dialog.cancel();
dialog.dismiss();
// 打開文件
openFile(myTempFile);
try {
is.close();
} catch (Exception ex) {
Log.e(TAG, "getDataSource() error: " + ex.getMessage(), ex);
}
}
}
/**
*
* 打開文件進行安裝
*
*/
private void openFile(File f) {
Intent intent = new Intent();
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
intent.setAction(android.content.Intent.ACTION_VIEW);
// 獲得下載好的文件類型
String type = getMIMEType(f);
// 打開各種類型文件
intent.setDataAndType(Uri.fromFile(f), type);
// 安裝
activity.startActivity(intent);
}
/**
*
* 刪除臨時路徑裡的安裝包
*/
public void delFile() {
Log.i(TAG, "The TempFile(" + currentTempFilePath + ") was deleted.");
File myFile = new File(currentTempFilePath);
if (myFile.exists()) {
myFile.delete();
}
}
/**
*
* 獲得下載文件的類型
*
*
* @param f
*
* 文件名稱
*
* @return 文件類型
*/
private String getMIMEType(File f) {
String type = "";
// 獲得文件名稱
String fName = f.getName();
// 獲得文件擴展名
String end = fName
.substring(fName.lastIndexOf(".") + 1, fName.length())
.toLowerCase();
if (end.equals("m4a") || end.equals("mp3") || end.equals("mid")
|| end.equals("xmf") || end.equals("ogg") || end.equals("wav")) {
type = "audio";
} else if (end.equals("3gp") || end.equals("mp4")) {
type = "video";
} else if (end.equals("jpg") || end.equals("gif") || end.equals("png")
|| end.equals("jpeg") || end.equals("bmp")) {
type = "image";
} else if (end.equals("apk")) {
type = "application/vnd.android.package-archive";
} else {
type = "*";
}
if (end.equals("apk")) {
} else {
type += "/*";
}
return type;
}
}
最近在工作中新接觸了Google在今年新推出的Firebase服務,發現目前論壇上的資料比較少,所以自己整理了一份關於Firebase的一些相關東西,目前在使用上還存在一
雖然只是模仿,但我覺得這是學習自定義view的必經之路,所以還是把我所學到的東西拿出來與大家一起分享。先貼出一張progressBar的gif圖,其中有水平的進度條,和圓
本文講的是自定義View的第二種方式-----創建復合控件創建復合(組合)可以很好的創建出具有重用功能的控件集合。這種方式通常需要繼承一個ViewGroup,再給它添加指
微信可以辦護照、續簽港澳通行證,只有1%的人知道!你也趕快來學習吧,我們是及時update的小伙伴。辦護照、續簽港澳通行證功能,對於需要經常出行出差的朋友來