當前位置:首頁 » 安卓系統 » androidvnd

androidvnd

發布時間: 2022-09-21 22:01:15

Ⅰ apk是什麼

Android應用程序包。

APK是Android操作系統使用的一種應用程序包文件格式,用於分發和安裝移動應用及中間件。

一個Android應用程序的代碼想要在Android設備上運行,必須先進行編譯,然後被打包成為一個被Android系統所能識別的文件才可以被運行,而這種能被Android系統識別並運行的文件格式便是「APK」。

(1)androidvnd擴展閱讀:

通常,用戶永遠不會看到APK文件,因為Android 通過Google Play或其他應用分發平台在後台處理應用安裝。

但是,有許多網站為想要自己手動安裝應用的 Android 用戶提供直接的APK文件下載。

在這種情況下,用戶應該小心APK 文件的來源,因為惡意軟體可以在APK文件中分發,就像在 Windows 和.EXE 文件中一樣。

APK文件以壓縮的.ZIP格式保存,可以通過任何Zip解壓縮工具打開。因此,如果要瀏覽APK文件的內容,可以將文件擴展名重命名為「.zip」並打開文件,也可以直接通過Zip應用程序的打開對話框打開文件。

參考資料來源:網路——APK

Ⅱ android中Uri.parse()用法

通用資源標志符(Universal Resource Identifier, 簡稱"URI")。
Uri代表要操作的數據,Android上可用的每種資源 - 圖像、視頻片段等都可以用Uri來表示。Android平台而言,URI主要分三個部分:

  1. scheme

  2. authority

  3. path


其中authority又分為host和port。格式如下:

scheme://host:port/path


實際的例子:



我們很經常需要解析Uri,並從Uri中獲取數據。
Android系統提供了兩個用於操作Uri的工具類,分別為UriMatcher 和ContentUris 。
掌握它們的使用,會便於我們的Android開發工作。

Ⅲ android contentprovider 有什麼用

1.適用場景
1) ContentProvider為存儲和讀取數據提供了統一的介面
2) 使用ContentProvider,應用程序可以實現數據共享
3) android內置的許多數據都是使用ContentProvider形式,供開發者調用的(如視頻,音頻,圖片,通訊錄等)
2.相關概念介紹
1)ContentProvider簡介
當應用繼承ContentProvider類,並重寫該類用於提供數據和存儲數據的方法,就可以向其他應用共享其數據。雖然使用其他方法也可以對外共享數據,但數據訪問方式會因數據存儲的方式而不同,如:採用文件方式對外共享數據,需要進行文件操作讀寫數據;採用sharedpreferences共享數據,需要使用sharedpreferences API讀寫數據。而使用ContentProvider共享數據的好處是統一了數據訪問方式。
2)Uri類簡介
Uri uri = Uri.parse("content://com.changcheng.provider.contactprovider/contact")
在Content Provider中使用的查詢字元串有別於標準的sql查詢。很多諸如select, add, delete, modify等操作我們都使用一種特殊的URI來進行,這種URI由3個部分組成, 「content://」, 代表數據的路徑,和一個可選的標識數據的ID。以下是一些示例URI:
content://media/internal/images 這個URI將返回設備上存儲的所有圖片
content://contacts/people/ 這個URI將返回設備上的所有聯系人信息
content://contacts/people/45 這個URI返回單個結果(聯系人信息中ID為45的聯系人記錄)
盡管這種查詢字元串格式很常見,但是它看起來還是有點令人迷惑。為此,Android提供一系列的幫助類(在android.provider包下),裡麵包含了很多以類變數形式給出的查詢字元串,這種方式更容易讓我們理解一點,因此,如上面content://contacts/people/45這個URI就可以寫成如下形式:
Uri person = ContentUris.withAppendedId(People.CONTENT_URI, 45);
然後執行數據查詢:
Cursor cur = managedQuery(person, null, null, null);
這個查詢返回一個包含所有數據欄位的游標,我們可以通過迭代這個游標來獲取所有的數據:

package com.wissen.testApp;
public class ContentProviderDemo extends Activity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
displayRecords();
}

private void displayRecords() {
//該數組中包含了所有要返回的欄位
String columns[] = new String[] { People.NAME, People.NUMBER };
Uri mContacts = People.CONTENT_URI;
Cursor cur = managedQuery(
mContacts,
columns, // 要返回的數據欄位
null, // WHERE子句
null, // WHERE 子句的參數
null // Order-by子句
);
if (cur.moveToFirst()) {
String name = null;
String phoneNo = null;
do {
// 獲取欄位的值
name = cur.getString(cur.getColumnIndex(People.NAME));
phoneNo = cur.getString(cur.getColumnIndex(People.NUMBER));
Toast.makeText(this, name + 」 」 + phoneNo, Toast.LENGTH_LONG).show();
} while (cur.moveToNext());
}
}
}

上例示範了一個如何依次讀取聯系人信息表中的指定數據列name和number。
修改記錄:
我們可以使用ContentResolver.update()方法來修改數據,我們來寫一個修改數據的方法:
private void updateRecord(int recNo, String name) {
Uri uri = ContentUris.withAppendedId(People.CONTENT_URI, recNo);
ContentValues values = new ContentValues();
values.put(People.NAME, name);
getContentResolver().update(uri, values, null, null);
}
現在你可以調用上面的方法來更新指定記錄:
updateRecord(10, 」XYZ」); //更改第10條記錄的name欄位值為「XYZ」
添加記錄:
要增加記錄,我們可以調用ContentResolver.insert()方法,該方法接受一個要增加的記錄的目標URI,以及一個包含了新記錄值的Map對象,調用後的返回值是新記錄的URI,包含記錄號。
上面的例子中我們都是基於聯系人信息簿這個標準的Content Provider,現在我們繼續來創建一個insertRecord() 方法以對聯系人信息簿中進行數據的添加:

private void insertRecords(String name, String phoneNo) {
ContentValues values = new ContentValues();
values.put(People.NAME, name);
Uri uri = getContentResolver().insert(People.CONTENT_URI, values);
Log.d(」ANDROID」, uri.toString());
Uri numberUri = Uri.withAppendedPath(uri, People.Phones.CONTENT_DIRECTORY);
values.clear();
values.put(Contacts.Phones.TYPE, People.Phones.TYPE_MOBILE);
values.put(People.NUMBER, phoneNo);
getContentResolver().insert(numberUri, values);
}

這樣我們就可以調用insertRecords(name, phoneNo)的方式來向聯系人信息簿中添加聯系人姓名和電話號碼。

刪除記錄:
Content Provider中的getContextResolver.delete()方法可以用來刪除記錄,下面的記錄用來刪除設備上所有的聯系人信息:
private void deleteRecords() {
Uri uri = People.CONTENT_URI;
getContentResolver().delete(uri, null, null);
}
你也可以指定WHERE條件語句來刪除特定的記錄:
getContentResolver().delete(uri, 「NAME=」 + 「『XYZ XYZ』」, null);
這將會刪除name為『XYZ XYZ』的記錄。
3. 創建ContentProvider
要創建我們自己的Content Provider的話,我們需要遵循以下幾步:
a. 創建一個繼承了ContentProvider父類的類

b. 定義一個名為CONTENT_URI,並且是public static final的Uri類型的類變數,你必須為其指定一個唯一的字元串值,最好的方案是以類的全名稱, 如:
public static final Uri CONTENT_URI = Uri.parse( 「content://com.google.android.MyContentProvider」);
c. 定義你要返回給客戶端的數據列名。如果你正在使用Android資料庫,必須為其定義一個叫_id的列,它用來表示每條記錄的唯一性。
d. 創建你的數據存儲系統。大多數Content Provider使用Android文件系統或SQLite資料庫來保持數據,但是你也可以以任何你想要的方式來存儲。

e. 如果你要存儲位元組型數據,比如點陣圖文件等,數據列其實是一個表示實際保存文件的URI字元串,通過它來讀取對應的文件數據。處理這種數據類型的Content Provider需要實現一個名為_data的欄位,_data欄位列出了該文件在Android文件系統上的精確路徑。這個欄位不僅是供客戶端使用,而且也可以供ContentResolver使用。客戶端可以調用ContentResolver.openOutputStream()方法來處理該URI指向的文件資源;如果是ContentResolver本身的話,由於其持有的許可權比客戶端要高,所以它能直接訪問該數據文件。

f. 聲明public static String型的變數,用於指定要從游標處返回的數據列。

g. 查詢返回一個Cursor類型的對象。所有執行寫操作的方法如insert(), update() 以及delete()都將被監聽。我們可以通過使用ContentResover().notifyChange()方法來通知監聽器關於數據更新的信息。

h. 在AndroidMenifest.xml中使用<provider>標簽來設置Content Provider。

i. 如果你要處理的數據類型是一種比較新的類型,你就必須先定義一個新的MIME類型,以供ContentProvider.geType(url)來返回。MIME類型有兩種形式:一種是為指定的單個記錄的,還有一種是為多條記錄的。這里給出一種常用的格式:
vnd.android.cursor.item/vnd.yourcompanyname.contenttype (單個記錄的MIME類型)
比如, 一個請求列車信息的URI如content://com.example.transportationprovider/trains/122 可能就會返回typevnd.android.cursor.item/vnd.example.rail這樣一個MIME類型。
vnd.android.cursor.dir/vnd.yourcompanyname.contenttype (多個記錄的MIME類型)
比如, 一個請求所有列車信息的URI如content://com.example.transportationprovider/trains 可能就會返回vnd.android.cursor.dir/vnd.example.rail這樣一個MIME 類型。
下列代碼將創建一個Content Provider,它僅僅是存儲用戶名稱並顯示所有的用戶名稱(使用 SQLLite資料庫存儲這些數據):

public class MyUsers {
public static final String AUTHORITY = 「com.wissen.MyContentProvider」;

// BaseColumn類中已經包含了 _id欄位
public static final class User implements BaseColumns {
public static final Uri CONTENT_URI = Uri.parse(」content://com.wissen.MyContentProvider」);
// 表數據列
public static final String USER_NAME = 「USER_NAME」;
}
}

上面的類中定義了Content Provider的CONTENT_URI,以及數據列。下面我們將定義基於上面的類來定義實際的Content Provider類:

public class MyContentProvider extends ContentProvider {
private SQLiteDatabase sqlDB;
private DatabaseHelper dbHelper;
private static final String DATABASE_NAME = 「Users.db」;
private static final int DATABASE_VERSION= 1;
private static final String TABLE_NAME= 「User」;
private static final String TAG = 「MyContentProvider」;

private static class DatabaseHelper extends SQLiteOpenHelper {
DatabaseHelper(Context context) {
super(context, DATABASE_NAME, null, DATABASE_VERSION);
}

@Override
public void onCreate(SQLiteDatabase db) {
//創建用於存儲數據的表
db.execSQL(」Create table 」 + TABLE_NAME + 「( _id INTEGER PRIMARY KEY AUTOINCREMENT, USER_NAME TEXT);」);
}

@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
db.execSQL(」DROP TABLE IF EXISTS 」 + TABLE_NAME);
onCreate(db);
}
}

@Override
public int delete(Uri uri, String s, String[] as) {
return 0;
}

@Override
public String getType(Uri uri) {
return null;
}

@Override
public Uri insert(Uri uri, ContentValues contentvalues) {
sqlDB = dbHelper.getWritableDatabase();
long rowId = sqlDB.insert(TABLE_NAME, 「」, contentvalues);
if (rowId > 0) {
Uri rowUri = ContentUris.appendId(MyUsers.User.CONTENT_URI.buildUpon(), rowId).build();
getContext().getContentResolver().notifyChange(rowUri, null);
return rowUri;
}
throw new SQLException(」Failed to insert row into 」 + uri);
}

@Override
public boolean onCreate() {
dbHelper = new DatabaseHelper(getContext());
return (dbHelper == null) ? false : true;
}

@Override
public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) {
SQLiteQueryBuilder qb = new SQLiteQueryBuilder();
SQLiteDatabase db = dbHelper.getReadableDatabase();
qb.setTables(TABLE_NAME);
Cursor c = qb.query(db, projection, selection, null, null, null, sortOrder);
c.setNotificationUri(getContext().getContentResolver(), uri);
return c;
}

@Override
public int update(Uri uri, ContentValues contentvalues, String s, String[] as) {
return 0;
}
}

一個名為MyContentProvider的Content Provider創建完成了,它用於從Sqlite資料庫中添加和讀取記錄。
Content Provider的入口需要在AndroidManifest.xml中配置:
<provider android:name=」MyContentProvider」 android:authorities=」com.wissen.MyContentProvider」 />

之後,讓我們來使用這個定義好的Content Provider:
1)為應用程序添加ContentProvider的訪問許可權。
2)通過getContentResolver()方法得到ContentResolver對象。
3)調用ContentResolver類的query()方法查詢數據,該方法會返回一個Cursor對象。
4)對得到的Cursor對象進行分析,得到需要的數據。
5)調用Cursor類的close()方法將Cursor對象關閉。

public class MyContentDemo extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
insertRecord(」MyUser」);
displayRecords();
}

private void insertRecord(String userName) {
ContentValues values = new ContentValues();
values.put(MyUsers.User.USER_NAME, userName);
getContentResolver().insert(MyUsers.User.CONTENT_URI, values);
}

private void displayRecords() {
String columns[] = new String[] { MyUsers.User._ID, MyUsers.User.USER_NAME };
Uri myUri = MyUsers.User.CONTENT_URI;
Cursor cur = managedQuery(myUri, columns,null, null, null );
if (cur.moveToFirst()) {
String id = null;
String userName = null;
do {
id = cur.getString(cur.getColumnIndex(MyUsers.User._ID));
userName = cur.getString(cur.getColumnIndex(MyUsers.User.USER_NAME));
Toast.makeText(this, id + 」 」 + userName, Toast.LENGTH_LONG).show();
} while (cur.moveToNext());
}
}
}

Ⅳ android如何打開一個文件使用安裝應用程序嗎

應用中如何調用系統所裝的軟體打開一個文件,這是我們經常碰到的問題,下面是我所用到的一種方法,和大家一起分享一下!

這個是打開文件的一個方法:

java代碼

  • /**

  • *打開文件

  • *@paramfile

  • */

  • privatevoidopenFile(Filefile){

  • Intentintent=newIntent();

  • intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);

  • //設置intent的Action屬性

  • intent.setAction(Intent.ACTION_VIEW);

  • //獲取文件file的MIME類型

  • Stringtype=getMIMEType(file);

  • //設置intent的data和Type屬性。

  • intent.setDataAndType(/*uri*/Uri.fromFile(file),type);

  • //跳轉

  • startActivity(intent);

  • }

  • /**

  • *根據文件後綴名獲得對應的MIME類型。

  • *@paramfile

  • */

  • privateStringgetMIMEType(Filefile){

  • Stringtype="*/*";

  • StringfName=file.getName();

  • //獲取後綴名前的分隔符"."在fName中的位置。

  • intdotIndex=fName.lastIndexOf(".");

  • if(dotIndex<0){

  • returntype;

  • }

  • /*獲取文件的後綴名*/

  • Stringend=fName.substring(dotIndex,fName.length()).toLowerCase();

  • if(end=="")returntype;

  • //在MIME和文件類型的匹配表中找到對應的MIME類型。

  • for(inti=0;i<MIME_MapTable.length;i++){//MIME_MapTable??在這里你一定有疑問,這個MIME_MapTable是什麼?

  • if(end.equals(MIME_MapTable[i][0]))

  • type=MIME_MapTable[i][1];

  • }

  • returntype;

  • }

  • MIME_MapTable是所有文件的後綴名所對應的MIME類型的一個String數組:

    Java代碼

  • privatefinalString[][]MIME_MapTable={

  • //{後綴名,MIME類型}

  • {".3gp","video/3gpp"},

  • {".apk","application/vnd.android.package-archive"},

  • {".asf","video/x-ms-asf"},

  • {".avi","video/x-msvideo"},

  • {".bin","application/octet-stream"},

  • {".bmp","image/bmp"},

  • {".c","text/plain"},

  • {".class","application/octet-stream"},

  • {".conf","text/plain"},

  • {".cpp","text/plain"},

  • {".doc","application/msword"},

  • {".docx","application/vnd.openxmlformats-officedocument.wordprocessingml.document"},

  • {".xls","application/vnd.ms-excel"},

  • {".xlsx","application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"},

  • {".exe","application/octet-stream"},

  • {".gif","image/gif"},

  • {".gtar","application/x-gtar"},

  • {".gz","application/x-gzip"},

  • {".h","text/plain"},

  • {".htm","text/html"},

  • {".html","text/html"},

  • {".jar","application/java-archive"},

  • {".java","text/plain"},

  • {".jpeg","image/jpeg"},

  • {".jpg","image/jpeg"},

  • {".js","application/x-javascript"},

  • {".log","text/plain"},

  • {".m3u","audio/x-mpegurl"},

  • {".m4a","audio/mp4a-latm"},

  • {".m4b","audio/mp4a-latm"},

  • {".m4p","audio/mp4a-latm"},

  • {".m4u","video/vnd.mpegurl"},

  • {".m4v","video/x-m4v"},

  • {".mov","video/quicktime"},

  • {".mp2","audio/x-mpeg"},

  • {".mp3","audio/x-mpeg"},

  • {".mp4","video/mp4"},

  • {".mpc","application/vnd.mpohun.certificate"},

  • {".mpe","video/mpeg"},

  • {".mpeg","video/mpeg"},

  • {".mpg","video/mpeg"},

  • {".mpg4","video/mp4"},

  • {".mpga","audio/mpeg"},

  • {".msg","application/vnd.ms-outlook"},

  • {".ogg","audio/ogg"},

  • {".pdf","application/pdf"},

  • {".png","image/png"},

  • {".pps","application/vnd.ms-powerpoint"},

  • {".ppt","application/vnd.ms-powerpoint"},

  • {".pptx","application/vnd.openxmlformats-officedocument.presentationml.presentation"},

  • {".prop","text/plain"},

  • {".rc","text/plain"},

  • {".rmvb","audio/x-pn-realaudio"},

  • {".rtf","application/rtf"},

  • {".sh","text/plain"},

  • {".tar","application/x-tar"},

  • {".tgz","application/x-compressed"},

  • {".txt","text/plain"},

  • {".wav","audio/x-wav"},

  • {".wma","audio/x-ms-wma"},

  • {".wmv","audio/x-ms-wmv"},

  • {".wps","application/vnd.ms-works"},

  • {".xml","text/plain"},

  • {".z","application/x-compress"},

  • {".zip","application/x-zip-compressed"},

  • {"","*/*"}

  • };

Ⅳ apk入口在哪裡

android應用程序(apk)沒有固定的入口點,系統會根據各個程序的manifest設定,在發生指定事件的時候調用程序的指定位置。
如果你說的入口點是傳統上認為的main函數,那麼在android應用程序裡面,相對應的就是在manifest裡面用intent-filter設定了會處理main action的那個activity。
(5)androidvnd擴展閱讀:
APK(全稱:Android application package,Android應用程序包)是Android操作系統使用的一種應用程序包文件格式,用於分發和安裝移動應用及中間件。一個Android應用程序的代碼想要在Android設備上運行,必須先進行編譯,然後被打包成為一個被Android系統所能識別的文件才可以被運行,而這種能被Android系統識別並運行的文件格式便是「APK」。 一個APK文件內包含被編譯的代碼文件(.dex 文件),文件資源(resources), 原生資源文件(assets),證書(certificates),和清單文件(manifest file)。
APK 文件基於 ZIP 文件格式,它與JAR文件的構造方式相似,互聯網媒體類型是:application/vnd.android.package-archive。
介紹
APK是Android application package的縮寫,即Android安裝包(apk)。APK是類似SymbianSis或Sisx的文件格式。通過將APK文件直接傳到Android模擬器或Android手機中執行即可安裝。[2]
apk文件和sis一樣,把androidsdk編譯的工程打包成一個安裝程序文件,格式為apk。 APK文件其實是zip格式,但後綴名被修改為apk,通過UnZip解壓後,可以看到Dex文件,Dex是DalvikVM executes的簡稱,即Android Dalvik執行程序,並非Java ME的位元組碼而是Dalvik位元組碼。Android在運行一個程序時首先需要UnZip,然後類似Symbian那樣直接,但不同於Windows mobile中的PE文件,程序的保密性和可靠性不是很高,通過dexmp命令可以反編譯它,但這種架構符合發展規律,微軟的WindowsGadgets(WPF)也採用了這種架構方式。在Android平台中,dalvikvm的執行文件被打包為apk格式,最終運行時載入器會先解壓,然後獲取編譯後的androidmanifest.xml文件中的permission聲明對安全訪問的限制,要知道仍然存在很多安全限制,但將apk文件傳到/system/app文件夾下會發現執行是不受限制的。也許我們平時安裝都不會選用這個文件夾,但在androidrom中,系統的apk文件默認會放入這個文件夾,它們擁有root許可權。

Ⅵ 有沒有前輩能說清vnd.android.cursor.item的

ContentProvider用getType(Uri uri)返回uri代表數據的MIME類型,如果該數據可能包含多條記錄,MIME類型字元串以vnd.android.cursor.dir/開頭,如果該數據只包含一條數據,以vnd.android.cursor.item/開頭。

Ⅶ apk是什麼操作系統的可執行文件

apk是安卓(android)系統的可執行文件,其用於在設備上安裝應用程序。

Ⅷ android 如何打開系統聯系人界面

Intent intent = new Intent();
intent.setAction("android.intent.action.PICK");
intent.addCategory("android.intent.category.DEFAULT");
intent.setType("vnd.android.cursor.dir/phone_v2");
startActivityForResult(intent, 1);

Ⅸ 有沒有前輩能說清vnd.android.cursor.item的

比如說有.txt,.doc,還有其他的一些格式都可以對應一個text對應的格式,那麼我們就可以把這些歸到一個return this MIME type:vnd.android.cursor.item/vnd.example.text
然後就可以使用這個做對應的打開方式的動作(可以打開所有文本文件的動作)

Ⅹ 如何對Android的版本進行檢測與更新

一、准備

1.檢測當前版本的信息AndroidManifest.xml-->manifest-->android:versionName。

2.從伺服器獲取版本號(版本號存在於xml文件中)並與當前檢測到的版本進行匹配,如果不匹配,提示用戶進行升級,如果匹配則進入程序主界面。

3.當提示用戶進行版本升級時,如果用戶點擊了確定,系統將自動從伺服器上下載並進行自動升級,如果點擊取消將進入程序主界面。

二、效果圖


三、必要說明

伺服器端存儲apk文件,同時有version.xml文件便於比對更新。

<?xml version="1.0" encoding="utf-8"?>
<info>
<version>2.0</version>
<url>http://192.168.1.187:8080/mobilesafe.apk</url>
<description>檢測到最新版本,請及時更新!</description>
<url_server>http://192.168.1.99/version.xml</url_server>
</info>
通過一個實體類獲取上述信息。

package com.android;
public class UpdataInfo {
private String version;
private String url;
private String description;
private String url_server;

public String getUrl_server() {
return url_server;
}
public void setUrl_server(String url_server) {
this.url_server = url_server;
}
public String getVersion() {
return version;
}
public void setVersion(String version) {
this.version = version;
}
public String getUrl() {
return url;
}
public void setUrl(String url) {
this.url = url;
}
public String getDescription() {
return description;
}
public void setDescription(String description) {
this.description = description;
}
}
apk和版本信息地址都放在伺服器端的version.xml里比較方便,當然如果伺服器端不變動,apk地址可以放在strings.xml里,不過版本號信息是新的,必須放在伺服器端,xml地址放在strings.xml。

<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="hello">Hello World, VersionActivity!</string>
<string name="app_name">Version</string>
<string name="url_server">http://192.168.1.99/version.xml</string>
</resources>
不知道讀者發現沒有,筆者犯了個錯誤,那就是url_server地址必須放在本地,否則怎麼讀取version.xml,所以url_server不必在實體類和version里添加,畢竟是現需要version地址也就是url_server,才能夠讀取version。

三、代碼實現

<?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" >
<Button
android:id="@+id/btn_getVersion"
android:text="檢查更新"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
</LinearLayout>
package com.android;
import java.io.InputStream;
import org.xmlpull.v1.XmlPullParser;
import android.util.Xml;
public class UpdataInfoParser {
public static UpdataInfo getUpdataInfo(InputStream is) throws Exception{
XmlPullParser parser = Xml.newPullParser();
parser.setInput(is, "utf-8");
int type = parser.getEventType();
UpdataInfo info = new UpdataInfo();
while(type != XmlPullParser.END_DOCUMENT ){
switch (type) {
case XmlPullParser.START_TAG:
if("version".equals(parser.getName())){
info.setVersion(parser.nextText());
}else if ("url".equals(parser.getName())){
info.setUrl(parser.nextText());
}else if ("description".equals(parser.getName())){
info.setDescription(parser.nextText());
}
break;
}
type = parser.next();
}
return info;
}
}
package com.android;
import java.io.File;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.URL;
import android.app.Activity;
import android.app.AlertDialog;
import android.app.AlertDialog.Builder;
import android.app.ProgressDialog;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
import android.net.Uri;
import android.os.Bundle;
import android.os.Environment;
import android.os.Handler;
import android.os.Message;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.TextView;
import android.widget.Toast;
public class VersionActivity extends Activity {
private final String TAG = this.getClass().getName();
private final int UPDATA_NONEED = 0;
private final int UPDATA_CLIENT = 1;
private final int GET_UNDATAINFO_ERROR = 2;
private final int SDCARD_NOMOUNTED = 3;
private final int DOWN_ERROR = 4;
private Button getVersion;
private UpdataInfo info;
private String localVersion;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
getVersion = (Button) findViewById(R.id.btn_getVersion);
getVersion.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
try {
localVersion = getVersionName();
CheckVersionTask cv = new CheckVersionTask();
new Thread(cv).start();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
});
}
private String getVersionName() throws Exception {
//getPackageName()是你當前類的包名,0代表是獲取版本信息
PackageManager packageManager = getPackageManager();
PackageInfo packInfo = packageManager.getPackageInfo(getPackageName(),
0);
return packInfo.versionName;
}
public class CheckVersionTask implements Runnable {
InputStream is;
public void run() {
try {
String path = getResources().getString(R.string.url_server);
URL url = new URL(path);
HttpURLConnection conn = (HttpURLConnection) url
.openConnection();
conn.setConnectTimeout(5000);
conn.setRequestMethod("GET");
int responseCode = conn.getResponseCode();
if (responseCode == 200) {
// 從伺服器獲得一個輸入流
is = conn.getInputStream();
}
info = UpdataInfoParser.getUpdataInfo(is);
if (info.getVersion().equals(localVersion)) {
Log.i(TAG, "版本號相同");
Message msg = new Message();
msg.what = UPDATA_NONEED;
handler.sendMessage(msg);
// LoginMain();
} else {
Log.i(TAG, "版本號不相同 ");
Message msg = new Message();
msg.what = UPDATA_CLIENT;
handler.sendMessage(msg);
}
} catch (Exception e) {
Message msg = new Message();
msg.what = GET_UNDATAINFO_ERROR;
handler.sendMessage(msg);
e.printStackTrace();
}
}
}
Handler handler = new Handler() {
@Override
public void handleMessage(Message msg) {
// TODO Auto-generated method stub
super.handleMessage(msg);
switch (msg.what) {
case UPDATA_NONEED:
Toast.makeText(getApplicationContext(), "不需要更新",
Toast.LENGTH_SHORT).show();
case UPDATA_CLIENT:
//對話框通知用戶升級程序
showUpdataDialog();
break;
case GET_UNDATAINFO_ERROR:
//伺服器超時
Toast.makeText(getApplicationContext(), "獲取伺服器更新信息失敗", 1).show();
break;
case DOWN_ERROR:
//下載apk失敗
Toast.makeText(getApplicationContext(), "下載新版本失敗", 1).show();
break;
}
}
};
/*
*
* 彈出對話框通知用戶更新程序
*
* 彈出對話框的步驟:
* 1.創建alertDialog的builder.
* 2.要給builder設置屬性, 對話框的內容,樣式,按鈕
* 3.通過builder 創建一個對話框
* 4.對話框show()出來
*/
protected void showUpdataDialog() {
AlertDialog.Builder builer = new Builder(this);
builer.setTitle("版本升級");
builer.setMessage(info.getDescription());
//當點確定按鈕時從伺服器上下載 新的apk 然後安裝 װ
builer.setPositiveButton("確定", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
Log.i(TAG, "下載apk,更新");
downLoadApk();
}
});
builer.setNegativeButton("取消", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
// TODO Auto-generated method stub
//do sth
}
});
AlertDialog dialog = builer.create();
dialog.show();
}
/*
* 從伺服器中下載APK
*/
protected void downLoadApk() {
final ProgressDialog pd; //進度條對話框
pd = new ProgressDialog(this);
pd.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
pd.setMessage("正在下載更新");
pd.show();
new Thread(){
@Override
public void run() {
try {
File file = DownLoadManager.getFileFromServer(info.getUrl(), pd);
sleep(3000);
installApk(file);
pd.dismiss(); //結束掉進度條對話框
} catch (Exception e) {
Message msg = new Message();
msg.what = DOWN_ERROR;
handler.sendMessage(msg);
e.printStackTrace();
}
}}.start();
}

//安裝apk
protected void installApk(File file) {
Intent intent = new Intent();
//執行動作
intent.setAction(Intent.ACTION_VIEW);
//執行的數據類型
intent.setDataAndType(Uri.fromFile(file), "application/vnd.android.package-archive");
startActivity(intent);
}
}
package com.android;
import java.io.BufferedInputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.URL;
import android.app.ProgressDialog;
import android.os.Environment;
public class DownLoadManager {
public static File getFileFromServer(String path, ProgressDialog pd) throws Exception{
//如果相等的話表示當前的sdcard掛載在手機上並且是可用的
if(Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)){
URL url = new URL(path);
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setConnectTimeout(5000);
//獲取到文件的大小
pd.setMax(conn.getContentLength());
InputStream is = conn.getInputStream();
File file = new File(Environment.getExternalStorageDirectory(), "updata.apk");
FileOutputStream fos = new FileOutputStream(file);
BufferedInputStream bis = new BufferedInputStream(is);
byte[] buffer = new byte[1024];
int len ;
int total=0;
while((len =bis.read(buffer))!=-1){
fos.write(buffer, 0, len);
total+= len;
//獲取當前下載量
pd.setProgress(total);
}
fos.close();
bis.close();
is.close();
return file;
}
else{
return null;
}
}
}
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>

熱點內容
win7的緩存文件夾 發布:2025-01-12 23:32:12 瀏覽:954
安卓哪個文件鎖好 發布:2025-01-12 23:31:23 瀏覽:325
怎麼讓安卓用蘋果耳機有彈窗 發布:2025-01-12 23:30:34 瀏覽:958
oracle存儲過程有返回值 發布:2025-01-12 23:30:34 瀏覽:7
用友伺服器怎樣同步ip 發布:2025-01-12 23:29:52 瀏覽:979
qt編譯vlcqt庫 發布:2025-01-12 23:24:45 瀏覽:244
攻擊linux伺服器 發布:2025-01-12 23:17:01 瀏覽:6
天籟哪個配置親民 發布:2025-01-12 23:16:26 瀏覽:482
零售通交易密碼是什麼 發布:2025-01-12 23:13:02 瀏覽:319
監控器壓縮 發布:2025-01-12 22:51:29 瀏覽:248