admin管理员组

文章数量:1532342

2023年12月13日发(作者:)

AdroidStudioapp远程升级

手机APP开发完了,远程升级自动更新版本必不可少,不然每次更新版本就要重新安装,那就不合理了。刚开始感觉还没啥头绪,不会了

就问百度,复制粘贴修修改改就搞定了,直接上代码:

首先要在AndroidManifest添加版本号。

远程升级类

package ;

import adManager;

import astReceiver;

import t;

import ;

import Filter;

import ;

import ;

import ;

import nment;

import ;

import peMap;

import ;

import esApi;

import ovider;

import ;

import ption;

public class AppUpdataManger {

private String tag = "AppUpdataManger";

private DownloadManager downloadManager;

private Context mContext;

private long mTaskId;

private String downloadPath;

private String versionName;

public AppUpdataManger(Context context) {

xt = context;

}

//广播接收者,接收下载状态

private BroadcastReceiver receiver = new BroadcastReceiver() {

@Override

public void onReceive(Context context, Intent intent) {

checkDownloadStatus();//检查下载状态

}

};

@RequiresApi(api = N_OMB)

public void downloadAPK(String versionUrl, String versionName) {

nName = versionName;

Log.e("下载", versionUrl + versionName);

//将下载请求加入下载队列

downloadManager = (DownloadManager) temService(AD_SERVICE);

//创建下载任务

t request = new t((versionUrl));

owedOverRoaming(false);//漫游网络是否可以下载

//设置文件类型,可以在下载结束后自动打开该文件

MimeTypeMap mimeTypeMap = gleton();

String mimeString = eTypeFromExtension(eExtensionFromUrl(versionUrl));

eType(mimeString);//加入任务队列

//在通知栏显示,默认就是显示的

ificationVisibility(LITY_VISIBLE);

//设置通知栏标题

le("Download");

cription("");

owedOverRoaming(false);

ibleInDownloadsUi(true);

//设置下载的路径

File file = new File(ernalFilesDir(ORY_DOWNLOADS), versionName);

tinationUri(le(file));

downloadPath = olutePath();

//加入下载列后会给该任务返回一个long型的id,

//通过该id可以取消任务,重启任务等等 mTaskId = e(request);

//注册广播接收,监听下载状态

erReceiver(receiver, new IntentFilter(_DOWNLOAD_COMPLETE));

}

//检查下载状态

private void checkDownloadStatus() {

query = new ();

terById(mTaskId);//赛选下载任务,传入任务ID,可变参数

Cursor cursor = (query);

if (First()) {

int status = (umnIndex(_STATUS));

switch (status) {

case _PAUSED:

//下载暂停

Log.d(tag, "下载暂停");

break;

case _PENDING:

//下载延迟

Log.d(tag, "下载延迟");

break;

case _RUNNING:

//正在下载

Log.d(tag, "正在下载");

break;

case _SUCCESSFUL:

xt(mContext, "下载完成", _LONG).show();

//打开文件进行安装

installAPK();

break;

case _FAILED:

//下载失败

Log.d(tag, "下载失败");

xt(mContext, "更新失败", _LONG).show();

break;

}

}

();

}

//下载到本地后执行安装根据获得的id进行安装

protected void installAPK() {

setPermission(downloadPath);

Intent intent = new Intent(_VIEW);

// 由于没有在Activity环境下启动Activity,设置下面的标签

gs(_ACTIVITY_NEW_TASK);

//Android 7.0以上要使用FileProvider

if (_INT >= 24) {

File file = (new File(downloadPath));

//参数1 上下文, 参数2 Provider主机地址 和配置文件中保持一致 参数3 共享的文件

Uri apkUri = ForFile(mContext, "ovider", file);

//添加这一句表示对目标应用临时授权该Uri所代表的文件

gs(_GRANT_READ_URI_PERMISSION);

aAndType(apkUri, "application/e-archive");

} else {

aAndType(le(new File(ORY_DOWNLOADS, versionName)), "application/e-archive");

}

ctivity(intent);

}

//修改文件权限

private void setPermission(String absolutePath) {

String command = "chmod " + "777" + " " + absolutePath;

Runtime runtime = time();

try {

(command);

} catch (IOException e) {

tackTrace();

}

}

}

判断远程是否需要升级是根据版本号来判断的,所以你要在数据库要有一个版本列表的。每次登录都要获取数据库中最新版本和本地版本作

比较。较之低的话,启用远程升级。

package w;

import esApi;import patActivity;

import st;

import ssLint;

import t;

import ;

import Preferences;

import eInfo;

import eManager;

import ;

import ;

import r;

import e;

import ;

import ;

import ;

import ox;

import xt;

import ;

import ataManger;

import questHelper;

import 5;

import _ainPage;

import _t_Tance__t_Item_Img;

import ray;

import ception;

import ject;

import ption;

public class MainActivity extends AppCompatActivity {

private EditText user_edit;

private EditText passward_edit;

private CheckBox remeber_check;

private Button login_btn;

SharedPreferences sharedPreferences;

editor ;//获取编辑器

@Override

protected void onCreate(Bundle savedInstanceState) {

te(savedInstanceState);

if ((getIntent().getFlags() & _ACTIVITY_BROUGHT_TO_FRONT) != 0) {

finish();

return;

}

setContentView(ty_main);

user_edit=findViewById(_edit);

passward_edit=findViewById(rd_edit);

remeber_check=findViewById(r_passward);

login_btn=findViewById(_btn);

updateversion();

quanxian();

sharedPreferences = getSharedPreferences("userInfo", _PRIVATE);

editor = ();//获取编辑器

boolean isRemember = lean("remember_password",false);

if (isRemember){

String Name = ing("loginname","");

String Password = ing("userpassward","");

user_t(Name);

passward_t(Password);

remeber_cked(true);

}else{

user_t("");

passward_t("");

remeber_cked(false);

}

login_lickListener(new kListener() {

@Override

public void onClick(View v) {

String username=user_t().toString();

String userpassward=passward_t().toString();

if (y()||y())

{

xt(, "用户名和密码不能为空!", _LONG).show();

return;

}else{

String repassward= 5Capital(userpassward);

String url="AppPro_UserLogin?username="+username+"&password="+repassward;

new Thread(){

@Override

public void run() { try { String result= (url); Log.i("url",result); SaveUserInfo(result); } catch (JSONException | IOException e) { tackTrace(); } } }.start(); } } }); } private void SaveUserInfo(String result) throws JSONException { JSONObject result_json=new JSONObject(result); Log.i("data=",result_ng()); if ( nt( result_ing("success"))==1){ int uid=0; JSONArray data=result_NArray("data"); for (int i = 0; i < (); i++) { JSONObject object=NObject(i); uid=nt(ing("uid")); ("UserID", nt(ing("uid"))); ("DepartId", nt(ing("DepartId"))); ing("departname",ing("departname")); ing("realname",ing("realname")); ing("Phone",ing("Phone")); } if (remeber_ked()){ //remember_password lean("remember_password",true); ing("loginname",user_t().toString()); ing("userpassward",passward_t().toString()); }else{ lean("remember_password",false); } //版本存储 ing("banben",getVersionName(getApplicationContext())); ();//提交修改 Intent intent=new Intent(, ); startActivity(intent); }else{ Message message=new Message(); =1; ssage(message); } } //数据回调 @SuppressLint("HandlerLeak") private Handler handler = new Handler() { @RequiresApi(api = N_CODES.N) @Override public void handleMessage(Message msg) { switch (){ case 1: xt(,"账号密码错误",_SHORT).show(); break; case 2: try { SaveVersionInfo(ng()); } catch (JSONException e) { tackTrace(); } break; default: break; } } }; private void updateversion(){ String updateurl="AppPro_UpLog"; new Thread(){ @Override public void run() { try { String result= (updateurl); Message message=new Message(); =2; =result; ssage(message); } catch (IOException e) {

tackTrace();

}

}

}.start();

}

@RequiresApi(api = N_OMB)

private void SaveVersionInfo(String result) throws JSONException {

JSONObject result_json=new JSONObject(result);

int versioncode=1;

String versionname="1.0";

if ( nt( result_ing("success"))==1){

JSONArray data=result_NArray("data");

for (int i = 0; i < (); i++) {

JSONObject object=NObject(i);

// Log.i("TW1",f(ble("TW1"))+"°C");

versioncode=("editionId");

versionname=ing("editionName");

}

}

int version= getVersionCode(getApplicationContext());

if (version

AppUpdataManger appUpdataManger=new AppUpdataManger(getApplicationContext());

adAPK("124.160.103.218:1111/upFile/",versionname);

}

}

//版本名

public static String getVersionName(Context context) {

return getPackageInfo(context).versionName;

}

//版本号

public static int getVersionCode(Context context) {

return getPackageInfo(context).versionCode;

}

//获取版本info

private static PackageInfo getPackageInfo(Context context) {

PackageInfo pi = null;

try {

PackageManager pm = kageManager();

pi = kageInfo(kageName(),

_CONFIGURATIONS);

return pi;

} catch (Exception e) {

tackTrace();

}

return pi;

}

/**

* 手机文件读写权限的授权

*/

public void quanxian(){

if (_INT >= 23) {

int REQUEST_CODE_CONTACT = 101;

String[] permissions = {

_EXTERNAL_STORAGE};

//验证是否许可权限

for (String str : permissions) {

if (elfPermission(str) != SION_GRANTED) {

//申请权限

tPermissions(permissions, REQUEST_CODE_CONTACT);

return;

} else {

//这里就是权限打开之后自己要操作的逻辑

}

}

}

}

}

本文标签: 下载任务文件权限远程