由Activity发Intent引起的IllegalStateException异常

本文介绍了一个由Activity通过Intent启动另一个应用处理文件时引发的IllegalStateException异常案例。异常原因是目标设备上未安装能处理指定类型文件的应用。文中提供了修改代码以避免此类异常的方法,并建议检查设备上是否已安装合适的应用来处理特定文件类型。

1. 相关代码:

由Activity发Intent跳转引起的IllegalStateException异常。

public static Intent getApkFileIntent( Context context,String param ) {

    Intent intent = new Intent();
    intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
    intent.setAction(android.content.Intent.ACTION_VIEW);
    Uri uri = Uri.fromFile(new File(param ));
    intent.setDataAndType(uri,"application/vnd.ms-word");
    context.startActivity(intent);
    return intent;
}

2. 错误信息:

java.lang.IllegalStateException: Could not execute method of the activity
at android.view.View$1.onClick(View.java:4273)
at android.view.View.performClick(View.java:5217)
at android.view.View$PerformClick.run(View.java:20983)
at android.os.Handler.handleCallback(Handler.java:739)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:145)
at android.app.ActivityThread.main(ActivityThread.java:6117)
at java.lang.reflect.Method.invoke(Native Method)
at java.lang.reflect.Method.invoke(Method.java:372)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1399)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1194)
Caused by: java.lang.reflect.InvocationTargetException
at java.lang.reflect.Method.invoke(Native Method)
at java.lang.reflect.Method.invoke(Method.java:372)
at android.view.View$1.onClick(View.java:4268)
... 10 more
Caused by: android.content.ActivityNotFoundException: No Activity found to handle Intent { act=android.intent.action.VIEW dat=file:///storage/emulated/0/aaa.doc typ=application/vnd.ms-word flg=0x10000000 }
at android.app.Instrumentation.checkStartActivityResult(Instrumentation.java:1801)
at android.app.Instrumentation.execStartActivity(Instrumentation.java:1499)
at android.app.Activity.startActivityForResult(Activity.java:3954)
at android.app.Activity.startActivityForResult(Activity.java:3901)
at android.support.v4.app.FragmentActivity.startActivityForResult(FragmentActivity.java:820)
at android.app.Activity.startActivity(Activity.java:4225)
at android.app.Activity.startActivity(Activity.java:4193)
at cn.aaa.util.FileEngine.openFile(FileEngine.java:1062)
at cn.aaa.ui.activity.TestActivity.openFile(TestActivity.java:172)
... 13 more
java.lang.reflect.InvocationTargetException
at java.lang.reflect.Method.invoke(Native Method)
at java.lang.reflect.Method.invoke(Method.java:372)
at android.view.View$1.onClick(View.java:4268)
at android.view.View.performClick(View.java:5217)

。。。


3. 原因分析
从log来分析,很明显,是由于TestActivity发了Intent,act=android.intent.action.VIEW dat=file:///storage/emulated/0/aaa.doc typ=application/vnd.ms-word flg=0x10000000 },
从Intent的参数来看,是要用另外一个app打开word文档。但是,遗憾的是,整个手机中就没有打开这种类型的app,最终导致IllegalStateException异常。


4. 解决办法:

1. 这种异常,需要捕获,并抛出异常,提示用户“此文档无法打开”。


2. 在手机上安装一个可以打开word文档的app。


3. 将Intent相关参数改为"*/*",如:

intent.setDataAndType(uri,"*/*");

public class CreateIDActivity extends BaseMvvmActivity<ActivityCreateIdBinding>{ @Nullable @Override protected ActivityCreateIdBinding bindContentView(@Nullable Bundle bundle) { return ActivityCreateIdBinding.inflate(getLayoutInflater()); } @Override protected void subscribeViewModel(@Nullable Bundle bundle) { //返回登录选择界面 viewBinding.close.setOnClickListener(v -> { Intent intent = new Intent(CreateIDActivity.this, LoginChooseActivity.class); startActivity(intent); finish(); }); Button btnNext = viewBinding.btnContained; // 初始禁用 btnNext.setEnabled(false); btnNext.setAlpha(0.5f); //Text Input, Activate Button // 添加文本监听器 viewBinding.tfContent.addTextChangedListener(new TextWatcher() { @Override public void beforeTextChanged(CharSequence s, int start, int count, int after) { // 文本变化前 } @Override public void onTextChanged(CharSequence s, int start, int before, int count) { // 文本变化中 } @Override public void afterTextChanged(Editable s) { // 文本变化后 - 核心逻辑 boolean hasContent = !TextUtils.isEmpty(s.toString().trim()); btnNext.setEnabled(hasContent); btnNext.setAlpha(hasContent ? 1.0f : 0.5f); } }); //进入国家选择器 // btnNext.setOnClickListener(v -> { // Intent intent = new Intent(CreateIDActivity.this, SetPassActivity.class); // startActivity(intent); // }); //记录邮箱,进入密码输入界面 btnNext.setOnClickListener(v -> { Intent intent = new Intent(CreateIDActivity.this, SetPassActivity.class); startActivity(intent); }); //TODO 已有账号,跳转 viewBinding.text2.setOnClickListener(v -> { Intent intent = new Intent(CreateIDActivity.this, WelcomeActivity.class); startActivity(intent); finish(); }); } }为什么改完之后 界面无法进入了 进入该页面会直接重启app
最新发布
09-04
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

liranke

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值