我已经实现了autoUpdate功能,该功能会在有可用更新的情况下下载新应用,并删除旧应用并安装新应用。但是在目标SDK 24或更新API级别2以上的Phone os之后,此功能将无法正常工作。因为已经有旧的应用程序,因此我们正在尝试安装新的应用程序。
public class UpdateActivity extends AppCompatActivity implements
AppConstants {
public static final String TAG = UpdateActivity.class.getSimpleName();
private String appName = "demo.apk";
private int UNINSTALL_REQUEST_CODE = 1;
private final Handler mHideHandler = new Handler();
private View mContentView;
private BiColoredProgress numberProgressBar;
private Runnable backgroundRunnable;
private Runnable finishRunnable;
private Handler handler;
private static final int INSTALL = 1;
private static final int DOWNLOAD = 0;
private static int flag = 0;
private String updateUrl = "";
private class BackgroundDownloadRunnable implements Runnable {
BackgroundDownloadRunnable() {
}
public void run() {
DownloadFileFromURL d = new DownloadFileFromURL();
d.execute();
return;
}
}
private class FinishDownloadRunnable implements Runnable {
FinishDownloadRunnable() {
}
public void run() {
uninstallApp();
}
}
private final Runnable mHidePart2Runnable = new Runnable() {
@SuppressLint("InlinedApi")
@Override
public void run() {
// Delayed removal of status and navigation bar
mContentView.setSystemUiVisibility(View.SYSTEM_UI_FLAG_LOW_PROFILE
| View.SYSTEM_UI_FLAG_FULLSCREEN
| View.SYSTEM_UI_FLAG_LAYOUT_STABLE
| View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY
| View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
| View.SYSTEM_UI_FLAG_HIDE_NAVIGATION);
}
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_update);
flag = getIntent().getIntExtra("flag", 0);
updateUrl = getIntent().getStringExtra("updateUrl");
StrictMode.setThreadPolicy(new
StrictMode.ThreadPolicy.Builder().permitAll().build());
handler = new Handler();
mContentView = findViewById(R.id.fullscreen_content);
mHideHandler.post(mHidePart2Runnable);
finishRunnable = new BackgroundDownloadRunnable();
backgroundRunnable = new FinishDownloadRunnable();
numberProgressBar = findViewById(R.id.numberbar8);
try {
if (flag == DOWNLOAD) {
DownloadFileFromURL d = new DownloadFileFromURL();
d.execute();
flag = 1;
} else if (flag == INSTALL) {
installApp();
}
} catch (Exception e) {
e.printStackTrace();
}
}
private class DownloadFileFromURL extends AsyncTask<String, Integer,
String> {
DownloadFileFromURL() {
}
protected void onPreExecute() {
super.onPreExecute();
}
protected String doInBackground(String... f_url) {
try {
HttpURLConnection c = (HttpURLConnection) new
URL(updateUrl).openConnection();
c.setRequestMethod("POST");
c.setDoOutput(false);
c.connect();
int lengthOfFile = c.getContentLength();
File file = new
File(Environment.getExternalStorageDirectory().getPath() + "/Download/");
file.mkdirs();
File outputFile = new File(file, appName);
if (outputFile.exists()) {
outputFile.delete();
}
FileOutputStream fos = new FileOutputStream(outputFile);
InputStream is = c.getInputStream();
byte[] data = new
byte[AccessibilityNodeInfoCompat.ACTION_NEXT_HTML_ELEMENT];
long total1 = 0;
while (true) {
int count = is.read(data);
if (count == -1) {
break;
}
total1 += (long) count;
Integer[] strArr = new Integer[1];
strArr[0] = DOWNLOAD_COUNT + ((int) ((100 * total1) /
((long) lengthOfFile)));
publishProgress(strArr);
fos.write(data, 0, count);
}
fos.close();
is.close();
installApp();
new Thread(backgroundRunnable, "VersionChecker").start();
//uninstallApp();
} catch (Exception e) {
Log.e("Error: ", e.getMessage());
}
return null;
}
protected void onProgressUpdate(Integer... progress) {
try {
if (progress[0] > 0 && progress[0] <= 20) {
numberProgressBar.setProgress(progress[0]);
numberProgressBar.setColor(Color.parseColor("#d63232"));
}
if (progress[0] > 20 && progress[0] <= 40) {
numberProgressBar.setProgress(progress[0]);
numberProgressBar.setColor(Color.parseColor("#F1E84B"));
}
if (progress[0] > 40 && progress[0] <= 60) {
numberProgressBar.setProgress(progress[0]);
numberProgressBar.setColor(Color.parseColor("#2CACE3"));
}
if (progress[0] > 60 && progress[0] <= 80) {
numberProgressBar.setProgress(progress[0]);
numberProgressBar.setColor(Color.parseColor("#4CBB17"));
}
if (progress[0] > 80 && progress[0] <= 100) {
numberProgressBar.setProgress(progress[0]);
numberProgressBar.setColor(Color.parseColor("#39FF14"));
}
} catch (Exception e) {
e.printStackTrace();
}
}
protected void onPostExecute(String file_url) {
numberProgressBar.setVisibility(View.GONE);
}
}
protected void onActivityResult(int requestCode, int resultCode, Intent
data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == this.UNINSTALL_REQUEST_CODE && resultCode != -1) {
if (resultCode == 0) {
super.onBackPressed();
startActivity(intent);
} else if (resultCode == 1) {
super.onBackPressed();
}
}
}
private void uninstallApp() {
Intent intentDEl = new Intent("android.intent.action.DELETE");
intentDEl.setData(Uri.parse("package:com.demo"));
startActivityForResult(intentDEl, UNINSTALL_REQUEST_CODE);
}
private void installApp() {
File apkFile = new
File(Environment.getExternalStorageDirectory().getPath() + "/Download/",
appName);
Intent intent = new Intent(Intent.ACTION_VIEW);
intent.setDataAndType(Uri.fromFile(apkFile),
"application/vnd.android.package-archive");
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);
finish();
}
}