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 { //这里就是权限打开之后自己要操作的逻辑 } } } } }
版权声明:本文标题:AdroidStudioapp远程升级 内容由热心网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:https://m.elefans.com/xitong/1702458090a7958.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论