AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.asuscomm.mahaljsp.lcc"> <uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /> <uses-permission android:name="android.permission.REQUEST_INSTALL_PACKAGES"/> <application android:allowBackup="true" android:icon="@drawable/icon" android:label="@string/app_name" android:roundIcon="@mipmap/ic_launcher_round" android:supportsRtl="true" android:theme="@style/AppThemeDialog" android:usesCleartextTraffic="true"> <provider android:name="androidx.core.content.FileProvider" android:authorities="${applicationId}.fileprovider" android:exported="false" android:grantUriPermissions="true"> <meta-data android:name="android.support.FILE_PROVIDER_PATHS" android:resource="@xml/provider_paths"/> </provider> </application>
MainActivity.java
package com.asuscomm.mahaljsp.lcc; import androidx.annotation.NonNull; import androidx.appcompat.app.AppCompatActivity; import androidx.core.content.FileProvider; import android.Manifest; import android.content.Intent; import android.content.pm.PackageManager; import android.net.Uri; import android.os.Build; import android.os.Bundle; import android.os.Environment; import android.util.Log; import android.view.View; import android.widget.Toast; import java.io.BufferedInputStream; import java.io.File; import java.io.FileOutputStream; import java.io.InputStream; import java.io.OutputStream; import java.net.URL; import java.net.URLConnection; import java.util.HashMap; import java.util.Map; public class MainActivity extends AppCompatActivity { final int REQUEST_PERMISSION=101; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); G.context=this; getPermission(); } public void btnUpdate_click(View view){ /* Intent intent = new Intent(this, DownloadService.class); intent.putExtra("apkUrl", String.format("/files/android/%s", G.apk)); startService(intent); */ new Thread(()->{ downloadFile(String.format("/files/android/%s", G.apk)); installApk(new File(Environment.getExternalStorageDirectory().toString()+"/Download", G.apk)); }).start(); } private void init(){ } private void getPermission(){ if(Build.VERSION.SDK_INT>= Build.VERSION_CODES.M){ if(checkSelfPermission(Manifest.permission.WRITE_EXTERNAL_STORAGE)!= PackageManager.PERMISSION_GRANTED){ requestPermissions( new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, REQUEST_PERMISSION); } else{ init(); } } else{ init(); } } @Override public void onRequestPermissionsResult( int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { if(requestCode==REQUEST_PERMISSION){ Map<String, Integer> perms = new HashMap<String, Integer>(); perms.put(Manifest.permission.WRITE_EXTERNAL_STORAGE, PackageManager.PERMISSION_GRANTED); for (int i = 0; i < permissions.length; i++) perms.put(permissions[i], grantResults[i]); if (perms.get(Manifest.permission.WRITE_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED) { init(); } else{ Toast.makeText(this, "No permission", Toast.LENGTH_LONG).show(); finish(); } } else { super.onRequestPermissionsResult(requestCode, permissions, grantResults); } } private void installApk(File apkFile) { Intent intent = new Intent(Intent.ACTION_VIEW); intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); Uri uri= FileProvider.getUriForFile(this, BuildConfig.APPLICATION_ID +".fileprovider", apkFile); intent.setDataAndType(uri, "application/vnd.android.package-archive"); } else { intent.setDataAndType(Uri.fromFile(apkFile), "application/vnd.android.package-archive"); } startActivity(intent); } private String downloadFile(String strUrl){ int count; try { URL url = new URL(strUrl); URLConnection connection = url.openConnection(); connection.connect(); int lenghtOfFile = connection.getContentLength(); // download the file InputStream input = new BufferedInputStream(url.openStream(),8192); // Output stream OutputStream output = new FileOutputStream( String.format("%s/Download/%s", Environment.getExternalStorageDirectory().toString(),G.apk) ); byte data[] = new byte[1024]; long total = 0; while ((count = input.read(data)) != -1) { total += count; output.write(data, 0, count); } output.flush(); output.close(); input.close(); } catch (Exception e) { Log.d("Thomas", "download error"+e.getMessage()); } return null; } }
G.java
public class G { public static Context context; //public static String apk="Lcc.apk"; public static String apk="PatrolCar_3.0.4.apk"; }
res/provider_paths.xml
<?xml version ="1.0" encoding ="utf-8"?> <resources> <paths> <root-path name="root" path="" /> <files-path name="files" path="" /> <cache-path name="cache" path="" /> <external-path name="external" path="" /> <external-files-path name="external_file_path" path="" /> <external-cache-path name="external_cache_path" path="" /> </paths> </resources>
