博客
关于我
Android 版本更新之打开apk文件的前生今世
阅读量:804 次
发布时间:2023-01-23

本文共 5236 字,大约阅读时间需要 17 分钟。

AP$

Version Update Workflow in Android Applications

Updating an app to ensure users always have the latest version is a critical feature. Let's explore the process step-by-step.

Android 6.0 (Before Android 7.0)

1. Permissions The app must request the necessary permissions for accessing external storage. xml <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

2. APK Download (Using Assets) java private void copyFile() { InputStream inputStream = null; FileOutputStream outputStream = null; try { inputStream = context.getAssets().open("app-debug.apk"); // Get the mounted storage directory String state = Environment.getExternalStorageState(); if (state.equals(Environment.MEDIA_MOUNTED)) { File dirFile = new File(Environment.getExternalStorageDirectory() + "/ceshi/"); if (!dirFile.exists()) { dirFile.mkdirs(); } File apk = new File(dir + "app-debug.apk"); if (!apk.exists()) { apk.createNewFile(); } outputStream = new FileOutputStream(apk); byte[] buffer = new byte[1024]; int byteCount = 0; while ((byteCount = inputStream.read(buffer)) != -1) { outputStream.write(buffer, 0, byteCount); } outputStream.flush(); } } catch (IOException e) { e.printStackTrace(); } finally { try { inputStream.close(); } catch (IOException e) { e.printStackTrace(); } try { outputStream.close(); } catch (IOException e) { e.printStackTrace(); } } }

3. Installing the APK java public static void openFile(Context context, String pathName) { Intent intent = new Intent(Intent.ACTION_VIEW); intent.setDataAndType(Uri.fromFile(file), "application/vnd.android.package-archive"); context.startActivity(intent); }

Android 6.0

1. Runtime Permissions Due to Android 6.0's runtime permissions, the app must dynamically request read and write permissions. java compile 'com.yanzhenjie:permission:1.0.5'

```java
if (AndPermission.hasPermission(context, Manifest.permission.READ_EXTERNAL_STORAGE, Manifest.permission.WRITE_EXTERNAL_STORAGE)) {
// Request granted, proceed with download
copyFile();
} else {
// Request permissions
AndPermission.with(MainActivity.this)
.requestCode(101)
.permission(Manifest.permission.READ_EXTERNAL_STORAGE, Manifest.permission.WRITE_EXTERNAL_STORAGE)
.send();
}
```
```java
@Override
protected void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
AndPermission.onRequestPermissionsResult(requestCode, permissions, grantResults, listener);
}
```
```java
private PermissionListener listener = new PermissionListener() {
@Override
public void onSucceed(int requestCode, List
grantedPermissions) {
if (requestCode == 101) {
copyFile();
}
}
@Override
public void onFailed(int requestCode, List
deniedPermissions) {
if (AndPermission.hasAlwaysDeniedPermission MainActivity.this, deniedPermissions)) {
AndPermission.defaultSettingDialog(MainActivity.this, 300).show();
}
}
};
```

Android 7.0

1. File Sharing Permissions xml <provider android:name="android.support.v4.content.FileProvider" android:authorities="com.tianer.ch.fileprovider" android:exported="false" android:granturipermissions="true"> <meta-data android:name="android.support.FILE_PROVIDER_PATHS" android:resource="@xml/file_paths" /> </provider>

```xml
```

2. Opening APKs java public static void openFile(Context context, String pathName, String authority) { if (pathName == null) { return; } File file = new File(pathName); if (file == null || !file.exists()) { return; } Intent intent = new Intent(Intent.ACTION_VIEW); if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); intent.setDataAndType(FileProvider.getUriForFile(context, authority, file), "application/vnd.android.package-archive"); } else { intent.setDataAndType(Uri.fromFile(file), "application/vnd.android.package-archive"); } context.startActivity(intent); }

Android 8.0

1. New Installation Permissions xml <uses-permission android:name="android.permission.REQUEST_INSTALL_PACKAGES" />

2. Granting Permissions java if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { if (getPackageManager().canRequestPackageInstalls()) { FileUtil.openFile(context, dir + "app-debug.apk", "com.tianer.ch.fileprovider"); } else { startInstallPermissionSettingActivity(); } }

3. Permission Handling java @RequiresApi(api = Build.VERSION_CODES.O) private void startInstallPermissionSettingActivity() { Intent intent = new Intent(Settings.ACTION_MANAGE_UNKNOWN_APP_SOURCES); startActivityForResult(intent, 10086); }

4. Result Handling java @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); if (requestCode == 10086) { FileUtil.openFile(context, dir + "app-debug.apk", "com.tianer.ch.fileprovider"); } }

Your feedback and appreciation are what drive me to keep updating this blog. If you found this article useful, please don't forget to like and share it.

转载地址:http://wseyk.baihongyu.com/

你可能感兴趣的文章
MySQL Server 5.5安装记录
查看>>
mysql server has gone away
查看>>
mysql skip-grant-tables_MySQL root用户忘记密码怎么办?修改密码方法:skip-grant-tables
查看>>
mysql slave 停了_slave 停止。求解决方法
查看>>
MySQL SQL 优化指南:主键、ORDER BY、GROUP BY 和 UPDATE 优化详解
查看>>
MYSQL sql语句针对数据记录时间范围查询的效率对比
查看>>
mysql sum 没返回,如果没有找到任何值,我如何在MySQL中获得SUM函数以返回'0'?
查看>>
mysql sysbench测试安装及命令
查看>>
mysql Timestamp时间隔了8小时
查看>>
Mysql tinyint(1)与tinyint(4)的区别
查看>>
MySQL Troubleshoting:Waiting on query cache mutex
查看>>
mysql union orderby 无效
查看>>
mysql v$session_Oracle 进程查看v$session
查看>>
mysql where中如何判断不为空
查看>>
MySQL Workbench 使用手册:从入门到精通
查看>>
MySQL Workbench 数据库建模详解:从设计到实践
查看>>
MySQL Workbench 数据建模全解析:从基础到实践
查看>>
mysql workbench6.3.5_MySQL Workbench
查看>>
MySQL Workbench安装教程以及菜单汉化
查看>>
MySQL Xtrabackup 安装、备份、恢复
查看>>