diff --git a/lib/src/main/java/com/wuliang/lib/InstallActivity.java b/lib/src/main/java/com/wuliang/lib/InstallActivity.java index fa6e51d..74b3a16 100644 --- a/lib/src/main/java/com/wuliang/lib/InstallActivity.java +++ b/lib/src/main/java/com/wuliang/lib/InstallActivity.java @@ -43,6 +43,7 @@ public class InstallActivity extends AppCompatActivity { private List apkPaths; private ExecutorService installXapkExectuor; + private PackageInstaller.Session mSession; @Override protected void onCreate(@Nullable Bundle savedInstanceState) { @@ -67,7 +68,13 @@ public class InstallActivity extends AppCompatActivity { } if (apkPaths == null || apkPaths.isEmpty()) { - Toast.makeText(this, "文件找不到", Toast.LENGTH_SHORT).show(); + Toast.makeText(this, "解析apk出错或已取消", Toast.LENGTH_SHORT).show(); + finish(); + } + + if (RomUtils.isMeizu() || RomUtils.isVivo()) { + Toast.makeText(this,"魅族或VIVO系统用户如遇安装被中止或者安装失败的情况,请尝试联系手机平台客服,或者更换系统内置包安装器再重试", + Toast.LENGTH_SHORT).show(); finish(); } @@ -76,7 +83,7 @@ public class InstallActivity extends AppCompatActivity { try { - PackageInstaller.Session mSession = initSession(); + mSession = initSession(); for (String apkPath : apkPaths) { addApkToInstallSession(apkPath, mSession); @@ -86,6 +93,7 @@ public class InstallActivity extends AppCompatActivity { } catch (IOException e) { e.printStackTrace(); + abandonSession(); } }); @@ -136,9 +144,18 @@ public class InstallActivity extends AppCompatActivity { } + @TargetApi(21) + private void abandonSession() { + if (mSession != null) { + mSession.abandon(); + mSession.close(); + } + } + @TargetApi(21) @Override protected void onNewIntent(Intent intent) { + super.onNewIntent(intent); Bundle extras = intent.getExtras(); if (PACKAGE_INSTALLED_ACTION.equals(intent.getAction())) { int status = -100; @@ -186,5 +203,7 @@ public class InstallActivity extends AppCompatActivity { installXapkExectuor.shutdown(); } + abandonSession(); + } } diff --git a/lib/src/main/java/com/wuliang/lib/RomUtils.java b/lib/src/main/java/com/wuliang/lib/RomUtils.java new file mode 100644 index 0000000..ba7cd4d --- /dev/null +++ b/lib/src/main/java/com/wuliang/lib/RomUtils.java @@ -0,0 +1,456 @@ +package com.wuliang.lib; + +import android.annotation.SuppressLint; +import android.os.Build; +import android.os.Environment; +import android.text.TextUtils; + +import java.io.BufferedReader; +import java.io.File; +import java.io.FileInputStream; +import java.io.IOException; +import java.io.InputStreamReader; +import java.lang.reflect.Method; +import java.util.Properties; + +/** + *
+ *     author: Blankj
+ *     blog  : http://blankj.com
+ *     time  : 2018/07/04
+ *     desc  : utils about rom
+ * 
+ */ +public final class RomUtils { + + private static final String[] ROM_HUAWEI = {"huawei"}; + private static final String[] ROM_VIVO = {"vivo"}; + private static final String[] ROM_XIAOMI = {"xiaomi"}; + private static final String[] ROM_OPPO = {"oppo"}; + private static final String[] ROM_LEECO = {"leeco", "letv"}; + private static final String[] ROM_360 = {"360", "qiku"}; + private static final String[] ROM_ZTE = {"zte"}; + private static final String[] ROM_ONEPLUS = {"oneplus"}; + private static final String[] ROM_NUBIA = {"nubia"}; + private static final String[] ROM_COOLPAD = {"coolpad", "yulong"}; + private static final String[] ROM_LG = {"lg", "lge"}; + private static final String[] ROM_GOOGLE = {"google"}; + private static final String[] ROM_SAMSUNG = {"samsung"}; + private static final String[] ROM_MEIZU = {"meizu"}; + private static final String[] ROM_LENOVO = {"lenovo"}; + private static final String[] ROM_SMARTISAN = {"smartisan"}; + private static final String[] ROM_HTC = {"htc"}; + private static final String[] ROM_SONY = {"sony"}; + private static final String[] ROM_GIONEE = {"gionee", "amigo"}; + private static final String[] ROM_MOTOROLA = {"motorola"}; + + private static final String VERSION_PROPERTY_HUAWEI = "ro.build.version.emui"; + private static final String VERSION_PROPERTY_VIVO = "ro.vivo.os.build.display.id"; + private static final String VERSION_PROPERTY_XIAOMI = "ro.build.version.incremental"; + private static final String VERSION_PROPERTY_OPPO = "ro.build.version.opporom"; + private static final String VERSION_PROPERTY_LEECO = "ro.letv.release.version"; + private static final String VERSION_PROPERTY_360 = "ro.build.uiversion"; + private static final String VERSION_PROPERTY_ZTE = "ro.build.MiFavor_version"; + private static final String VERSION_PROPERTY_ONEPLUS = "ro.rom.version"; + private static final String VERSION_PROPERTY_NUBIA = "ro.build.rom.id"; + private final static String UNKNOWN = "unknown"; + + private static RomInfo bean = null; + + private RomUtils() { + throw new UnsupportedOperationException("u can't instantiate me..."); + } + + /** + * Return whether the rom is made by huawei. + * + * @return {@code true}: yes
{@code false}: no + */ + public static boolean isHuawei() { + return ROM_HUAWEI[0].equals(getRomInfo().name); + } + + /** + * Return whether the rom is made by vivo. + * + * @return {@code true}: yes
{@code false}: no + */ + public static boolean isVivo() { + return ROM_VIVO[0].equals(getRomInfo().name); + } + + /** + * Return whether the rom is made by xiaomi. + * + * @return {@code true}: yes
{@code false}: no + */ + public static boolean isXiaomi() { + return ROM_XIAOMI[0].equals(getRomInfo().name); + } + + /** + * Return whether the rom is made by oppo. + * + * @return {@code true}: yes
{@code false}: no + */ + public static boolean isOppo() { + return ROM_OPPO[0].equals(getRomInfo().name); + } + + /** + * Return whether the rom is made by leeco. + * + * @return {@code true}: yes
{@code false}: no + */ + public static boolean isLeeco() { + return ROM_LEECO[0].equals(getRomInfo().name); + } + + /** + * Return whether the rom is made by 360. + * + * @return {@code true}: yes
{@code false}: no + */ + public static boolean is360() { + return ROM_360[0].equals(getRomInfo().name); + } + + /** + * Return whether the rom is made by zte. + * + * @return {@code true}: yes
{@code false}: no + */ + public static boolean isZte() { + return ROM_ZTE[0].equals(getRomInfo().name); + } + + /** + * Return whether the rom is made by oneplus. + * + * @return {@code true}: yes
{@code false}: no + */ + public static boolean isOneplus() { + return ROM_ONEPLUS[0].equals(getRomInfo().name); + } + + /** + * Return whether the rom is made by nubia. + * + * @return {@code true}: yes
{@code false}: no + */ + public static boolean isNubia() { + return ROM_NUBIA[0].equals(getRomInfo().name); + } + + /** + * Return whether the rom is made by coolpad. + * + * @return {@code true}: yes
{@code false}: no + */ + public static boolean isCoolpad() { + return ROM_COOLPAD[0].equals(getRomInfo().name); + } + + /** + * Return whether the rom is made by lg. + * + * @return {@code true}: yes
{@code false}: no + */ + public static boolean isLg() { + return ROM_LG[0].equals(getRomInfo().name); + } + + /** + * Return whether the rom is made by google. + * + * @return {@code true}: yes
{@code false}: no + */ + public static boolean isGoogle() { + return ROM_GOOGLE[0].equals(getRomInfo().name); + } + + /** + * Return whether the rom is made by samsung. + * + * @return {@code true}: yes
{@code false}: no + */ + public static boolean isSamsung() { + return ROM_SAMSUNG[0].equals(getRomInfo().name); + } + + /** + * Return whether the rom is made by meizu. + * + * @return {@code true}: yes
{@code false}: no + */ + public static boolean isMeizu() { + return ROM_MEIZU[0].equals(getRomInfo().name); + } + + /** + * Return whether the rom is made by lenovo. + * + * @return {@code true}: yes
{@code false}: no + */ + public static boolean isLenovo() { + return ROM_LENOVO[0].equals(getRomInfo().name); + } + + /** + * Return whether the rom is made by smartisan. + * + * @return {@code true}: yes
{@code false}: no + */ + public static boolean isSmartisan() { + return ROM_SMARTISAN[0].equals(getRomInfo().name); + } + + /** + * Return whether the rom is made by htc. + * + * @return {@code true}: yes
{@code false}: no + */ + public static boolean isHtc() { + return ROM_HTC[0].equals(getRomInfo().name); + } + + /** + * Return whether the rom is made by sony. + * + * @return {@code true}: yes
{@code false}: no + */ + public static boolean isSony() { + return ROM_SONY[0].equals(getRomInfo().name); + } + + /** + * Return whether the rom is made by gionee. + * + * @return {@code true}: yes
{@code false}: no + */ + public static boolean isGionee() { + return ROM_GIONEE[0].equals(getRomInfo().name); + } + + /** + * Return whether the rom is made by motorola. + * + * @return {@code true}: yes
{@code false}: no + */ + public static boolean isMotorola() { + return ROM_MOTOROLA[0].equals(getRomInfo().name); + } + + /** + * Return the rom's information. + * + * @return the rom's information + */ + public static RomInfo getRomInfo() { + if (bean != null) return bean; + bean = new RomInfo(); + final String brand = getBrand(); + final String manufacturer = getManufacturer(); + if (isRightRom(brand, manufacturer, ROM_HUAWEI)) { + bean.name = ROM_HUAWEI[0]; + String version = getRomVersion(VERSION_PROPERTY_HUAWEI); + String[] temp = version.split("_"); + if (temp.length > 1) { + bean.version = temp[1]; + } else { + bean.version = version; + } + return bean; + } + if (isRightRom(brand, manufacturer, ROM_VIVO)) { + bean.name = ROM_VIVO[0]; + bean.version = getRomVersion(VERSION_PROPERTY_VIVO); + return bean; + } + if (isRightRom(brand, manufacturer, ROM_XIAOMI)) { + bean.name = ROM_XIAOMI[0]; + bean.version = getRomVersion(VERSION_PROPERTY_XIAOMI); + return bean; + } + if (isRightRom(brand, manufacturer, ROM_OPPO)) { + bean.name = ROM_OPPO[0]; + bean.version = getRomVersion(VERSION_PROPERTY_OPPO); + return bean; + } + if (isRightRom(brand, manufacturer, ROM_LEECO)) { + bean.name = ROM_LEECO[0]; + bean.version = getRomVersion(VERSION_PROPERTY_LEECO); + return bean; + } + + if (isRightRom(brand, manufacturer, ROM_360)) { + bean.name = ROM_360[0]; + bean.version = getRomVersion(VERSION_PROPERTY_360); + return bean; + } + if (isRightRom(brand, manufacturer, ROM_ZTE)) { + bean.name = ROM_ZTE[0]; + bean.version = getRomVersion(VERSION_PROPERTY_ZTE); + return bean; + } + if (isRightRom(brand, manufacturer, ROM_ONEPLUS)) { + bean.name = ROM_ONEPLUS[0]; + bean.version = getRomVersion(VERSION_PROPERTY_ONEPLUS); + return bean; + } + if (isRightRom(brand, manufacturer, ROM_NUBIA)) { + bean.name = ROM_NUBIA[0]; + bean.version = getRomVersion(VERSION_PROPERTY_NUBIA); + return bean; + } + + if (isRightRom(brand, manufacturer, ROM_COOLPAD)) { + bean.name = ROM_COOLPAD[0]; + } else if (isRightRom(brand, manufacturer, ROM_LG)) { + bean.name = ROM_LG[0]; + } else if (isRightRom(brand, manufacturer, ROM_GOOGLE)) { + bean.name = ROM_GOOGLE[0]; + } else if (isRightRom(brand, manufacturer, ROM_SAMSUNG)) { + bean.name = ROM_SAMSUNG[0]; + } else if (isRightRom(brand, manufacturer, ROM_MEIZU)) { + bean.name = ROM_MEIZU[0]; + } else if (isRightRom(brand, manufacturer, ROM_LENOVO)) { + bean.name = ROM_LENOVO[0]; + } else if (isRightRom(brand, manufacturer, ROM_SMARTISAN)) { + bean.name = ROM_SMARTISAN[0]; + } else if (isRightRom(brand, manufacturer, ROM_HTC)) { + bean.name = ROM_HTC[0]; + } else if (isRightRom(brand, manufacturer, ROM_SONY)) { + bean.name = ROM_SONY[0]; + } else if (isRightRom(brand, manufacturer, ROM_GIONEE)) { + bean.name = ROM_GIONEE[0]; + } else if (isRightRom(brand, manufacturer, ROM_MOTOROLA)) { + bean.name = ROM_MOTOROLA[0]; + } else { + bean.name = manufacturer; + } + bean.version = getRomVersion(""); + return bean; + } + + private static boolean isRightRom(final String brand, final String manufacturer, final String... names) { + for (String name : names) { + if (brand.contains(name) || manufacturer.contains(name)) { + return true; + } + } + return false; + } + + private static String getManufacturer() { + try { + String manufacturer = Build.MANUFACTURER; + if (!TextUtils.isEmpty(manufacturer)) { + return manufacturer.toLowerCase(); + } + } catch (Throwable ignore) { /**/ } + return UNKNOWN; + } + + private static String getBrand() { + try { + String brand = Build.BRAND; + if (!TextUtils.isEmpty(brand)) { + return brand.toLowerCase(); + } + } catch (Throwable ignore) { /**/ } + return UNKNOWN; + } + + private static String getRomVersion(final String propertyName) { + String ret = ""; + if (!TextUtils.isEmpty(propertyName)) { + ret = getSystemProperty(propertyName); + } + if (TextUtils.isEmpty(ret) || ret.equals(UNKNOWN)) { + try { + String display = Build.DISPLAY; + if (!TextUtils.isEmpty(display)) { + ret = display.toLowerCase(); + } + } catch (Throwable ignore) { /**/ } + } + if (TextUtils.isEmpty(ret)) { + return UNKNOWN; + } + return ret; + } + + private static String getSystemProperty(final String name) { + String prop = getSystemPropertyByShell(name); + if (!TextUtils.isEmpty(prop)) return prop; + prop = getSystemPropertyByStream(name); + if (!TextUtils.isEmpty(prop)) return prop; + if (Build.VERSION.SDK_INT < 28) { + return getSystemPropertyByReflect(name); + } + return prop; + } + + private static String getSystemPropertyByShell(final String propName) { + String line; + BufferedReader input = null; + try { + Process p = Runtime.getRuntime().exec("getprop " + propName); + input = new BufferedReader(new InputStreamReader(p.getInputStream()), 1024); + String ret = input.readLine(); + if (ret != null) { + return ret; + } + } catch (IOException ignore) { + } finally { + if (input != null) { + try { + input.close(); + } catch (IOException ignore) { /**/ } + } + } + return ""; + } + + private static String getSystemPropertyByStream(final String key) { + try { + Properties prop = new Properties(); + FileInputStream is = new FileInputStream( + new File(Environment.getRootDirectory(), "build.prop") + ); + prop.load(is); + return prop.getProperty(key, ""); + } catch (Exception ignore) { /**/ } + return ""; + } + + private static String getSystemPropertyByReflect(String key) { + try { + @SuppressLint("PrivateApi") + Class clz = Class.forName("android.os.SystemProperties"); + Method getMethod = clz.getMethod("get", String.class, String.class); + return (String) getMethod.invoke(clz, key, ""); + } catch (Exception e) { /**/ } + return ""; + } + + public static class RomInfo { + private String name; + private String version; + + public String getName() { + return name; + } + + public String getVersion() { + return version; + } + + @Override + public String toString() { + return "RomInfo{name=" + name + + ", version=" + version + "}"; + } + } +}