**/实现检查更新操作的主activity
**
public class UpgradeActivity extends AppCompatActivity {
private ImageView opening;
private File file;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_NO_TITLE);
getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_HIDE_NAVIGATION);
getWindow().getDecorView().setSystemUiVisibility(
View.SYSTEM_UI_FLAG_LAYOUT_STABLE
| View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
| View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
| View.SYSTEM_UI_FLAG_HIDE_NAVIGATION // hide nav
// bar
| View.SYSTEM_UI_FLAG_FULLSCREEN // hide status bar
| View.SYSTEM_UI_FLAG_IMMERSIVE);
setContentView(R.layout.activity_upgrade);
opening=(ImageView)findViewById(R.id.opening) ;
DisplayMetrics metric = new DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(metric);
int screen_x = metric.widthPixels; // 屏幕宽度(像素)
int screen_y = metric.heightPixels; // 屏幕高度(像素)
android.view.animation.Animation translateAnimation = new TranslateAnimation(50,50,200,0);//平移动画 从0,0,平移到100,100
translateAnimation.setDuration(1500);//动画持续的时间为1.5s
opening.setAnimation(translateAnimation);//给imageView添加的动画效果
translateAnimation.setFillEnabled(true);//使其可以填充效果从而不回到原地
translateAnimation.setFillAfter(true);//不回到起始位置
//如果不添加setFillEnabled和setFillAfter则动画执行结束后会自动回到远点
translateAnimation.startNow();//动画开始执行 放在最后即可
new Handler().postDelayed(new Runnable(){//开场logo2秒后进入检查更新
@Override
public void run() {
// TODO Auto-generated method stub
doUpgrade();
}
}, 2000);
}
private void showDialogUpdate(String uri,String versionName,String description){
android.app.AlertDialog.Builder builder=new android.app.AlertDialog.Builder(UpgradeActivity.this);
builder.setTitle("版本升级").
setIcon(R.mipmap.ic_launcher);
if ((versionName.length()+description.length())<26){
builder.setMessage("版本名 :"+versionName+"\n"+"更新内容:"+description+"\n\n");
}else {
builder.setMessage("版本名 :"+versionName+"\n"+"更新内容:"+description+"\n\n\n");
}
builder.setCancelable(false);
builder.setPositiveButton("确定", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
loadNewVersionProgress(uri);
}
});
android.app.AlertDialog alertDialog=builder.create();
alertDialog.show();
WindowManager.LayoutParams lp= alertDialog.getWindow().getAttributes();
lp.width=800;//定义宽度
lp.height=380;//定义高度
alertDialog.getWindow().setAttributes(lp);
alertDialog.getButton(DialogInterface.BUTTON_POSITIVE).setTextColor(Color.parseColor("#FF5E5E"));
alertDialog.getButton(DialogInterface.BUTTON_POSITIVE).setTextSize(30);
try {
Field mAlert = android.app.AlertDialog.class.getDeclaredField("mAlert");
mAlert.setAccessible(true);
Object mAlertController = mAlert.get(alertDialog);
Field mTitle = mAlertController.getClass().getDeclaredField("mTitleView");
mTitle.setAccessible(true);
TextView mTitleView = (TextView) mTitle.get(mAlertController);
mTitleView.setTextSize(35);
mTitleView.setTextColor(Color.BLACK);
//通过反射修改message字体大小和颜色
Field mMessage = mAlertController.getClass().getDeclaredField("mMessageView");
mMessage.setAccessible(true);
TextView mMessageView = (TextView) mMessage.get(mAlertController);
mMessageView.setTextSize(30);
mMessageView.setTextColor(Color.BLACK);
mMessageView.setPadding(40,0,0,55);
} catch (IllegalAccessException e1) {
e1.printStackTrace();
} catch (NoSuchFieldException e2) {
e2.printStackTrace();
}
}
private void loadNewVersionProgress(String uri){
final ProgressDialog pd;
Context context=UpgradeActivity.this;
pd=new ProgressDialog(this);
pd.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
pd.setMessage("正在为你更新中");
pd.setCancelable(false);
pd.show();
new Thread(){
@Override
public void run() {
try{
file=getFileFromServer(uri,pd);
sleep(3000);
// File newFile = new File(Environment.getExternalStorageDirectory()+"/idrmsapp", "app-armeabi-v7a-debug.apk");
installNormal(getApplication(),file);
pd.dismiss();
}catch (Exception e){//下载失败
e.printStackTrace();
}
}
}.start();
}
//普通安装
private static void installNormal(Context context,File file) {
Intent intent = new Intent(Intent.ACTION_VIEW);
//版本在7.0以上是不能直接通过uri访问的
if (Build.VERSION.SDK_INT > Build.VERSION_CODES.N) {
// 由于没有在Activity环境下启动Activity,设置下面的标签
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
//参数1 上下文, 参数2 Provider主机地址 和配置文件中保持一致 参数3 共享的文件
Uri apkUri = FileProvider.getUriForFile(context, "com.beike.idrms.fileprovider", file);
//添加这一句表示对目标应用临时授权该Uri所代表的文件
intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
intent.setDataAndType(apkUri, "application/vnd.android.package-archive");
} else {
intent.setDataAndType(Uri.fromFile(file),
"application/vnd.android.package-archive");
}
context.startActivity(intent);
}
public static File getFileFromServer(String uri,ProgressDialog pd)throws Exception{
if(Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)){
URL url=new URL(uri);
HttpURLConnection conn=(HttpURLConnection)url.openConnection();
conn.setConnectTimeout(5000);
pd.setMax(conn.getContentLength());//获取文件大小
InputStream is=conn.getInputStream();
long time=System.currentTimeMillis();//当前时间
File file=new File(Environment.getExternalStorageDirectory()+"/idrmsapp",time+"");
FileOutputStream fos=new FileOutputStream(file);
BufferedInputStream bis=new BufferedInputStream(is);
byte[] buffer=new byte[1024];
int len;
int total=0;
while (-1!=(len=bis.read(buffer))){
fos.write(buffer,0,len);
total+=len;
pd.setProgress(total);//获取当前下载量
}
fos.close();
bis.close();
is.close();
return file;
}
else {
return null;
}
}
private int getVersionCode(){
return BuildConfig.VERSION_CODE;
}
private String downloadUrl;
private String versionName;
private String description;
private Handler showUpgradeDialogHandler = new Handler(){
@Override
public void dispatchMessage(Message msg) {
super.dispatchMessage(msg);
showDialogUpdate(downloadUrl,versionName,description);
}
};
private void doUpgrade(){
OkHttpConnection mOkHttpConnection;
mOkHttpConnection = new OkHttpConnection();
mOkHttpConnection.getCode(ConstantConfig.GET_VERSION,getVersionCode(),new ResponseCallback(){
@Override
public void failed(Call call, IOException e) {
Message msg = new Message();
msg.obj = "do";
}
@Override
public void success(Call call, Response response) {
Message msg = new Message();
msg.obj = "do";
try {
JSONObject everyData;
String data = response.body().string();
Log.i("ResponseData", data);
if (null != data) {
JSONObject jsonObject = new JSONObject(data);
int code = jsonObject.getInt("code");
if (code==ConstantConfig.SUCESS_CODE){
String updata = jsonObject.getString("data");
if (0<updata.length()){
everyData=new JSONObject(updata);
downloadUrl=everyData.getString("downloadUrl");
versionName=everyData.getString("versionName");
description=everyData.getString("description");
showUpgradeDialogHandler.sendEmptyMessage(0);
}
}else {
Intent intent=new Intent();
intent.setClass(UpgradeActivity.this,ImageSliderShowActivity.class);
startActivity(intent);
}
}
} catch (IOException e) {
e.printStackTrace();
} catch (JSONException e) {
e.printStackTrace();
}
}
});
}
}
这个是 res文件夹下pei'配置文件epaths.xml
<?xml version="1.0" encoding="utf-8"?>
<paths xmlns:android="http://schemas.android.com/apk/res/android">
<external-path name="idrms_app" path="idrmsapp" />
</paths>
在AndroidManifest.xml清单中添加权限
<uses-permission android:name="android.permission.REQUEST_INSTALL_PACKAGES" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.INSTALL_PACKAGES"
也在其中加入provider配置
<provider
android:authorities="com.beike.idrms.fileprovider"
android:name="android.support.v4.content.FileProvider"
android:grantUriPermissions="true"
android:exported="false">
<meta-data
android:name="android.support.FILE_PROVIDER_PATHS"
android:resource="@xml/filepaths"/>
</provider>