【问题标题】:android.content.ActivityNotFoundException while opening .docx or .doc file from web从网络打开 .docx 或 .doc 文件时出现 android.content.ActivityNotFoundException
【发布时间】:2018-04-09 17:43:59
【问题描述】:

当我尝试从网络打开 .docx 或 .doc 或 .txt 文件时出现以下错误,但我没有看到此异常,如果文件类型为 .pdf 或 .jpg,我可以打开文件

java.lang.RuntimeException: An error occurred while executing doInBackground()
    at android.os.AsyncTask$3.done(AsyncTask.java:318)
    at java.util.concurrent.FutureTask.finishCompletion(FutureTask.java:354)
    at java.util.concurrent.FutureTask.setException(FutureTask.java:223)
    at java.util.concurrent.FutureTask.run(FutureTask.java:242)
    at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:243)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1133)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:607)
    at java.lang.Thread.run(Thread.java:761)
 Caused by: android.content.ActivityNotFoundException: No Activity found to handle Intent { act=android.intent.action.VIEW dat=http://10.0.2.2:8081/... typ=application/msword flg=0x14000000 (has extras) }
    at android.app.Instrumentation.checkStartActivityResult(Instrumentation.java:1809)
    at android.app.Instrumentation.execStartActivity(Instrumentation.java:1523)
    at android.app.Activity.startActivityForResult(Activity.java:4224)
    at android.support.v4.app.BaseFragmentActivityApi16.startActivityForResult(BaseFragmentActivityApi16.java:54)
    at android.support.v4.app.FragmentActivity.startActivityForResult(FragmentActivity.java:68)
    at android.app.Activity.startActivityForResult(Activity.java:4183)
    at android.support.v4.app.FragmentActivity.startActivityForResult(FragmentActivity.java:751)
    at android.app.Activity.startActivity(Activity.java:4507)
    at android.app.Activity.startActivity(Activity.java:4475)
    at com.example.test.OpenFileTask.openDoc1(OpenFileTask.java:89)
    at com.example.test.OpenFileTask.doInBackground(OpenFileTask.java:24)
    at android.os.AsyncTask$2.call(AsyncTask.java:304)
    at java.util.concurrent.FutureTask.run(FutureTask.java:237)
    at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:243) 
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1133) 
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:607) 
    at java.lang.Thread.run(Thread.java:761) 

下面是网址 http://10.0.2.2:8081/test/download/Test.doc?ticket=255c000161_word_l5906nc7ggozg.doc

如果我在浏览器中使用上述网址,浏览器会下载文件

下面是我在 MainActivity.java 中使用的代码

Uri path = Uri.parse(url);

    Intent intent = new Intent(Intent.ACTION_VIEW);
    String mimeType = getMimeType(url);
    intent.setDataAndType(path, mimeType);
    intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_NEW_TASK);
    activity.startActivity(intent);

manifest.xml

<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<application
    android:allowBackup="true"
    android:icon="@drawable/test_app_icon"
    android:label="@string/app_name"
    android:roundIcon="@mipmap/ic_launcher_round"
    android:supportsRtl="true"
    android:theme="@style/AppTheme">
    <meta-data android:name="android.webkit.WebView.MetricsOptOut"
               android:value="true" />
    <activity android:name=".MainActivity">
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />

            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>
</application>

我无法理解上述代码如何适用于 .pdf/.jpg 文件,而不适用于 .doc 或 .docx 或 .txt 文件。我还没有测试过 ppt 和 xlsx 文件

我的设备上同时安装了 google docs 和 OfficeSuite 应用。

我是 android 开发新手,非常感谢任何帮助

【问题讨论】:

  • 我正在使用 android webview,我还没有发布活动 xml。真的需要发到这里吗?它有简单的 WebView 元素。不使用 WebView 如何在 Android 应用中加载网页。
  • 如果您在问题中使用标签,我期望在您的问题中引用它,否则标签会产生误导。你不需要做任何事情,它只是帮助其他人理解你的问题,如果你分享你可以分享的东西,更广泛的受众会让你获得更多的曝光率和更平衡的答案。人们使用标签来搜索他们可能有意见的问题。

标签: android android-webview


【解决方案1】:

您安装的应用程序很可能能够查看本地文件,但无法从 Internet 下载它们。自己下载文件(例如,通过 OkHttp),设置 FileProvider 以使文件可用,然后使用 FileProvider.getUriForFile() 获取 Uri 以在您的 Intent 中使用。

【讨论】:

  • 感谢您的回复。我想到了上述建议的方法,但如果用户将处理大量文件并且如果他们继续下载文件,那么他们的手机可能会用完空间。你还有什么建议吗?另外令我惊讶的是它适用于 .pdf 和 .jpg 文件
  • @Mohan:“你还有什么建议吗?” - 不。 “令我惊讶的是它适用于 .pdf 和 .jpg 文件”——大约有 20 亿台 Android 设备,分布在大约 10,000 种设备型号中。不要假设这大约 20 亿台设备中的每一台都会有一个响应ACTION_VIEW 的活动,http/httpsUri 用于 PDF 或 JPEG 文件。此外,不要假设那些确实尊重该结构的活动会神奇地不为下载的内容消耗磁盘空间。
猜你喜欢
  • 1970-01-01
  • 2012-08-01
  • 2023-03-25
  • 1970-01-01
  • 2010-12-06
  • 2019-11-09
  • 1970-01-01
  • 1970-01-01
  • 2015-11-06
相关资源
最近更新 更多