在我的应用程序中从Android浏览器打开文件链接

时间:2013-07-07 06:26:55

标签: android browser href intentfilter

我希望能够以通常的方式运行标准的Android浏览器,导航到带有指向文件的链接的页面,例如

<a href=./myfile.gcsb>click here</a>

点击该链接,让它启动我的应用程序,然后可以根据需要处理该文件。

网页基本上运行正常 - 点击PC上的Firefox链接,按预期我可以选择保存文件,或者使用注册的应用程序打开.gcsb文件类型。但不是在Android设备上。

我已经在我的应用程序中尝试了每个版本的intent-filter,但是,例如

<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="http" android:host="*" android:mimeType="application/*" android:pathPattern=".*\\.gcsb" />
</intent-filter>

并且没有一个导致应用程序在单击浏览器中的链接时启动。

我知道有很多关于此的帖子,但到目前为止他们都没有帮助我解决这个问题。任何建议都感激不尽。 (运行Android OS 2.2)。

1 个答案:

答案 0 :(得分:2)

对它进行排序。首先从其他帖子看来,在同一个窗口中从Android浏览器打开链接通常存在问题。因此将target = _blank添加到原始

<a href ...> ...

处理了这个问题(虽然最后见了附带条件)。

看似有效的意图过滤器是

<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="http" android:host="*" android:pathPattern=".*\\.gcsb" />
</intent-filter>

并且活动onCreate()/ onRestart()中的代码是

String  action = intent.getAction();

if (!Intent.ACTION_VIEW.equals(action))
    return;

Uri     uri = intent.getData();
String  scheme = uri.getScheme();
String  name = null;

if (scheme.equals("http")) {
    List<String>
            pathSegments = uri.getPathSegments();

    if (pathSegments.size() > 0)
        name = pathSegments.get(pathSegments.size() - 1);

    URL     url = new URL(uri.toString());
    HttpURLConnection
            urlConnection = (HttpURLConnection)url.openConnection();

    urlConnection.setRequestMethod("GET");
    urlConnection.setDoOutput(true);
    urlConnection.connect();

    is = urlConnection.getInputStream();
}

else if () {
    //  Deal with other schemes (file, content) here
}

//  Should have an open input stream and a target file name/ext by here
//  Make full path to where it needs to be saved from name
//  Open output stream
//  Loop round reading a buffer full of data from input stream and writing to output stream
//  Close everything
//  Not forgetting to deal with errors along the way

这一切似乎都有效,有两个附带条件:(1)所有这一切都应该在后台线程中完成,并且(2)target = _blank的效果是让android浏览器到 每次下载完成后都会打开新窗口 - 并且打开的窗口数量有限制。