移除SD卡后,程序直接被杀掉了,求解

sz0219a 2012-03-08 01:58:37
当我读取SD卡中的APK包信息后,拔出SD卡就会提示存储未正常移除,PrcoessKiller 打印 has open file,一会程序就被杀掉了
因为SD卡中APK包没有安装过的,所以普通packageinfo拿不到APK中的label,所以通过JAVA反射机制获取,此方法是从网上摘的,请大侠指导~
private GameInfo showUninstallAPKIcon(String apkPath) {//执行此方法后,把出U盘则出问题
GameInfo gameInfo = new GameInfo();
PackageManager pm = getPackageManager();
String PATH_PackageParser = "android.content.pm.PackageParser";

String PATH_AssetManager = "android.content.res.AssetManager";

try {

Class pkgParserCls = Class.forName(PATH_PackageParser);

Class[] typeArgs = new Class[1];

typeArgs[0] = String.class;

Constructor pkgParserCt = pkgParserCls.getConstructor(typeArgs);

Object[] valueArgs = new Object[1];

valueArgs[0] = apkPath;

Object pkgParser = pkgParserCt.newInstance(valueArgs);

DisplayMetrics metrics = new DisplayMetrics();

metrics.setToDefaults();

typeArgs = new Class[4];

typeArgs[0] = File.class;

typeArgs[1] = String.class;

typeArgs[2] = DisplayMetrics.class;

typeArgs[3] = Integer.TYPE;

Method pkgParser_parsePackageMtd = pkgParserCls.getDeclaredMethod(
"parsePackage", typeArgs);

valueArgs = new Object[4];

valueArgs[0] = new File(apkPath);

valueArgs[1] = apkPath;

valueArgs[2] = metrics;

valueArgs[3] = 0;

Object pkgParserPkg = pkgParser_parsePackageMtd.invoke(pkgParser,
valueArgs);


Field appInfoFld = pkgParserPkg.getClass().getDeclaredField(
"applicationInfo");

ApplicationInfo info = (ApplicationInfo) appInfoFld
.get(pkgParserPkg);

Class assetMagCls = Class.forName(PATH_AssetManager);

Constructor assetMagCt = assetMagCls.getConstructor((Class[]) null);

Object assetMag = assetMagCt.newInstance((Object[]) null);

typeArgs = new Class[1];

typeArgs[0] = String.class;

Method assetMag_addAssetPathMtd = assetMagCls.getDeclaredMethod(
"addAssetPath",

typeArgs);

valueArgs = new Object[1];

valueArgs[0] = apkPath;

assetMag_addAssetPathMtd.invoke(assetMag, valueArgs);

Resources res = getResources();

typeArgs = new Class[3];

typeArgs[0] = assetMag.getClass();

typeArgs[1] = res.getDisplayMetrics().getClass();

typeArgs[2] = res.getConfiguration().getClass();

Constructor resCt = Resources.class.getConstructor(typeArgs);

valueArgs = new Object[3];

valueArgs[0] = assetMag;

valueArgs[1] = res.getDisplayMetrics();

valueArgs[2] = res.getConfiguration();

res = (Resources) resCt.newInstance(valueArgs);//注释此处则没问题
res.getString(info.labelRes);//获取未安装APK包的label

} catch (Exception e) {
e.printStackTrace();
}
return gameInfo;
}
...全文
475 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
念茜 2012-03-09
  • 打赏
  • 举报
回复
程序在读SD卡,你非正常卸载,其实这时候是Busy态不允许卸载,那么肯定会出现:

E/ProcessKiller( 2176): Process com.android.xxx (2866) has open file
xxxxxxxx
W/ProcessKiller( 2176): Sending SIGHUP to process 2866
I/ActivityManager( 2250): Process com.android.xxx(pid 2866) has died.

试一试android.intent.action.MEDIA_BAD_REMOVAL,然后做些保护处理
追风筝的孩子 2012-03-08
  • 打赏
  • 举报
回复
是你的程序抛异常被强制关闭吧

80,493

社区成员

发帖
与我相关
我的任务
社区描述
移动平台 Android
androidandroid-studioandroidx 技术论坛(原bbs)
社区管理员
  • Android
  • yechaoa
  • 失落夏天
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧