【问题标题】:How to read files clicked in the Android web browser?如何读取在 Android 网络浏览器中单击的文件?
【发布时间】:2011-04-25 10:20:24
【问题描述】:

如何创建支持在网络浏览器中单击的某些文件类型的活动?

这是我尝试过的:

AndroidManifest.xml

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="net.sf.asap" android:versionCode="212" android:versionName="2.1.2">
    <application android:label="@string/app_name" android:icon="@drawable/icon">
        <activity android:name=".FileSelector" android:label="@string/app_name">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <activity android:name=".Player" android:label="@string/playing">
            <intent-filter>
                <action android:name="android.intent.action.VIEW" />
                <category android:name="android.intent.category.DEFAULT" />
                <category android:name="android.intent.category.BROWSABLE" />
                <data android:scheme="file" android:host="*" />
                <data android:scheme="http" android:host="*" />
                <data android:scheme="https" android:host="*" />
                <data android:pathPattern=".*\\.sap" />
                <data android:pathPattern=".*\\.cmc" />
                <data android:pathPattern=".*\\.cm3" />
                <data android:pathPattern=".*\\.cmr" />
                <data android:pathPattern=".*\\.cms" />
                <data android:pathPattern=".*\\.dmc" />
                <data android:pathPattern=".*\\.dlt" />
                <data android:pathPattern=".*\\.mpt" />
                <data android:pathPattern=".*\\.mpd" />
                <data android:pathPattern=".*\\.rmt" />
                <data android:pathPattern=".*\\.tmc" />
                <data android:pathPattern=".*\\.tm8" />
                <data android:pathPattern=".*\\.tm2" />
            </intent-filter>
        </activity>
    </application>
</manifest> 

Player.java的片段:

Uri uri = getIntent().getData();
InputStream is = getContentResolver().openInputStream(uri);

当我在浏览器 (Android 1.6) 中输入 URL 时,我得到:

E/AndroidRuntime(12026): Caused by: java.lang.RuntimeException: java.io.FileNotFoundException: No content provider: http://asap.sourceforge.net/X_Ray_2.sap
E/AndroidRuntime(12026):    at net.sf.asap.Player.onCreate(Player.java:109)
E/AndroidRuntime(12026):    at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1123)
E/AndroidRuntime(12026):    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2364)

【问题讨论】:

    标签: android browser


    【解决方案1】:

    首先,以下是一个非常糟糕的主意:

                <data android:scheme="file" android:host="*" />
                <data android:scheme="http" android:host="*" />
                <data android:scheme="https" android:host="*" />
    

    如果您中断他们在设备上任意位置单击的每个链接,您的用户会用镐攻击您,以便他们可以选择使用您的应用程序处理该链接。请删除这些行。

    关于您的错误,您正试图通过getContentResolver().openInputStream() 打开一个 Web URL (http://asap.sourceforge.net/X_Ray_2.sap)。这是不支持的。 ContentResolver 适用于 Android 内容提供程序。如果您想从 Internet 上下载某些内容,可以使用相应的 API,例如 HttpClient。

    【讨论】:

    • 不,我通过 pathPattern 过滤,并且 scheme/host 只是为了使 pathPattern 工作(显然 scheme="*" 不起作用)。我的应用程序仅针对我列出的扩展(检查 Web 浏览器和 OI 文件管理器)呈现给用户。
    • getContentResolver().openInputStream() 确实适用于“file:”URL,我希望它也适用于“http:”。谢谢!
    猜你喜欢
    • 2021-11-22
    • 2012-07-27
    • 2019-10-02
    • 2017-01-20
    • 1970-01-01
    • 2012-10-30
    • 2013-06-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多