一、版本升级
// 8.0以上系统调用安装应用
public void startInstallApk(String apkName) {
if (Build.VERSION.SDK_INT >= 26) {
boolean hasInstallPermission = getPackageManager().canRequestPackageInstalls();
if (!hasInstallPermission) {
//注意这个是8.0新API
Uri packageURI = Uri.parse("package:" + getPackageName());
Intent intent = new Intent(Settings.ACTION_MANAGE_UNKNOWN_APP_SOURCES, packageURI);
startActivityForResult(intent, 10025);
}
else {
installApk(apkName);
}
}
else {
installApk(apkName);
}
}
// 8.0以下系统安装应用
public void installApk(String apkName) {
FileUtils mFileUtils = new FileUtils();
Uri mUri;
Intent intent = new Intent();
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
intent.setAction(Intent.ACTION_VIEW);
//7.0系统开始认为直接使用本地Uri是不安全的 所以以FileProvider共享给外部提高安全性
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
mUri = FileProvider.getUriForFile(this, BuildConfig.APPLICATION_ID + BuildConfig.ProviderSuffix, mFileUtils.getApksFile(apkName));
} else {
mUri = Uri.fromFile(mFileUtils.getApksFile(shortCutName));
}
//添加这一句表示对目标应用临时授权该Uri所代表的文件
intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
intent.setDataAndType(mUri,
"application/vnd.android.package-archive");
startActivity(intent);
}
二、获取mac地址
// 获取外网Mac地址
public static String getConnectingWifiMac(Context context) {
WifiManager wm = (WifiManager) context.getApplicationContext().getSystemService(Context.WIFI_SERVICE);
WifiInfo info = wm.getConnectionInfo();
String mac = info.getBSSID();
if (mac == null || mac.equals("02:00:00:00:00:00")) {
mac = getMacAddr();
}
return mac;
}
private static String getMacAddr() {
try {
List<NetworkInterface> all = Collections.list(NetworkInterface.getNetworkInterfaces());
for (NetworkInterface nif : all) {
if (!nif.getName().equalsIgnoreCase("wlan0")) continue;
byte[] macBytes = nif.getHardwareAddress();
if (macBytes == null) {
return "";
}
StringBuilder res1 = new StringBuilder();
for (byte b : macBytes) {
res1.append(String.format("%02X:",b));
}
if (res1.length() > 0) {
res1.deleteCharAt(res1.length() - 1);
}
return res1.toString();
}
} catch (Exception ex) {
}
return "02:00:00:00:00:00";
}
Android 6.0以后用WifiManager获取的mac地址都是02:00:00:00:00:00, 因此需要用下面一种方法获取, 但是最近新出来的Android8.1系统要想获取到外网mac地址,必须打开GPS,否则获取出来是手机本地的mac地址
三、应用被释放后回来一片白
@Override
protected void onCreate(Bundle savedInstanceState) {
if (savedInstanceState != null) {
finish();
Intent intent = new Intent(this, LauncherActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK|Intent.FLAG_ACTIVITY_CLEAR_TASK);
startActivity(intent);
}
}
应用被释放以后回来力图恢复,但是由于复杂的环境经常会出现空指针,所以当程序被释放后最简单的方式就是重新打开启动页面从头开始
四、被释放后空指针问题
程序被释放后经常出现乱七八糟的问题,即使使用了上面的方案还是难免会出现空指针之类的问题,那是因为在Application里面声明了很多变量,给变量赋值以后在程序里面直接从Application里去拿,当应用被释放以后Application里面的数据都为空了,当程序重启的时候Application并没有重启, 所以第三点问题没有彻底解决,因此我们平时应用里面需要的变量要放到BaseActivity里或者BaseFragment里面,不能放到Application里。