从可浏览的意图android加载网址

时间:2015-02-11 10:57:46

标签: android android-intent

我实施了"<类别android:name =" android.intent.category.BROWSABLE" />" 在我的浏览器应用程序中,我希望任何其他浏览器显示列表,以选择处理该链接的应用程序,其工作正常我能够从列表中启动我的应用程序,但它不会在我的应用程序中加载该URL,它只是打开我的应用并将网址粘贴到文本字段中。任何线索?

编辑:我尝试将此文件用于在粘贴后加载网址,但应用程序强制关闭

TextView uri = (TextView) findViewById(R.id.urlField);
    //if (Intent.ACTION_MAIN.equals(getIntent().getAction())) {
        String intentUri = (new Intent("com.example.browsableintent.MY_ACTION"))
                .toUri(Intent.URI_INTENT_SCHEME).toString();
        uri.setText(intentUri);
        webView.loadUrl(intentUri);
        Log.w("URLHandler", intentUri);
    //} else {
        Uri data = getIntent().getData();
        if (data == null) {
            uri.setText("");
        } else {
            uri.setText(getIntent().getData().toString());
        }
    //}

清单

                

            <category android:name="android.intent.category.DEFAULT" />
            <category android:name="android.intent.category.LAUNCHER" />
            <category android:name="android.intent.category.BROWSABLE" />
            <category android:name="android.intent.category.APP_BROWSER" />
        </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" />
            <data android:scheme="https" />
            <data android:scheme="about" />
            <data android:scheme="javascript" />
        </intent-filter>

        <intent-filter>
            <action android:name="android.intent.action.VIEW" />

            <category android:name="android.intent.category.BROWSABLE" />
            <category android:name="android.intent.category.DEFAULT" />

            <data android:scheme="http" />
            <data android:scheme="https" />
            <data android:scheme="inline" />
            <data android:mimeType="text/html" />
            <data android:mimeType="text/plain" />
            <data android:mimeType="application/xhtml+xml" />
            <data android:mimeType="application/vnd.wap.xhtml+xml" />
        </intent-filter>
        <!-- For viewing saved web archives. -->
        <intent-filter>
            <action android:name="android.intent.action.VIEW" />

            <category android:name="android.intent.category.BROWSABLE" />
            <category android:name="android.intent.category.DEFAULT" />

            <data android:scheme="http" />
            <data android:scheme="https" />
            <data android:scheme="file" />
            <data android:mimeType="application/x-webarchive-xml" />
        </intent-filter>
        <intent-filter>
            <action android:name="android.intent.action.WEB_SEARCH" />

            <category android:name="android.intent.category.DEFAULT" />
            <category android:name="android.intent.category.BROWSABLE" />

            <data android:scheme="" />
            <data android:scheme="http" />
            <data android:scheme="https" />
        </intent-filter>

LOG

02-11 17:50:48.678: E/AndroidRuntime(29023): FATAL EXCEPTION: main
02-11 17:50:48.678: E/AndroidRuntime(29023): Process: com.air.swiftmp, PID: 29023
02-11 17:50:48.678: E/AndroidRuntime(29023): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.air.swiftmp/com.air.swiftmp.MainActivity}: java.lang.NullPointerException
02-11 17:50:48.678: E/AndroidRuntime(29023):    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2292)
02-11 17:50:48.678: E/AndroidRuntime(29023):    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2350)
02-11 17:50:48.678: E/AndroidRuntime(29023):    at android.app.ActivityThread.access$800(ActivityThread.java:163)
02-11 17:50:48.678: E/AndroidRuntime(29023):    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1257)
02-11 17:50:48.678: E/AndroidRuntime(29023):    at android.os.Handler.dispatchMessage(Handler.java:102)
02-11 17:50:48.678: E/AndroidRuntime(29023):    at android.os.Looper.loop(Looper.java:157)
02-11 17:50:48.678: E/AndroidRuntime(29023):    at android.app.ActivityThread.main(ActivityThread.java:5335)
02-11 17:50:48.678: E/AndroidRuntime(29023):    at   java.lang.reflect.Method.invokeNative(Native Method)
02-11 17:50:48.678: E/AndroidRuntime(29023):    at java.lang.reflect.Method.invoke(Method.java:515)
02-11 17:50:48.678: E/AndroidRuntime(29023):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1265)
02-11 17:50:48.678: E/AndroidRuntime(29023):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1081)
02-11 17:50:48.678: E/AndroidRuntime(29023):    at dalvik.system.NativeStart.main(Native Method)
02-11 17:50:48.678: E/AndroidRuntime(29023): Caused by: java.lang.NullPointerException
02-11 17:50:48.678: E/AndroidRuntime(29023):    at com.air.swiftmp.MainActivity.onCreate(MainActivity.java:95)
02-11 17:50:48.678: E/AndroidRuntime(29023):    at android.app.Activity.performCreate(Activity.java:5389)
02-11 17:50:48.678: E/AndroidRuntime(29023):    at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1105)
02-11 17:50:48.678: E/AndroidRuntime(29023):    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2256)

1 个答案:

答案 0 :(得分:1)

如果

,我会直言不讳
  

所有这一切都是打开我的应用并将网址粘贴到文本字段中。

这意味着

if (Intent.ACTION_MAIN.equals(getIntent().getAction())) {

返回true

我假设您的可浏览意图也是该应用程序的主要目的。

那么你的&#39;如果&#39;正在做的是检查你的“意图”是否正确。 (这也是你可浏览的)是主要意图&#39;,这是真的。

修改

好吧,基本上你要检查你正在打开的可浏览屏幕是否是你的应用程序在开启时应该显示的屏幕。

在你的Android Manifest中,你会有像

这样的东西
 <intent-filter>
     <action android:name="android.intent.action.MAIN" />
     <category android:name="android.intent.category.BROWSABLE" />
 </intent-filter>

这是你的可浏览意图。 当你调用getIntent()。getAction()时,它将返回与Intent.MAIN_ACTION相同的值。那是因为你在清单中定义了它。没错。

<action android:name="android.intent.action.MAIN" />

其次,您要加载屏幕打开时应用获取的网址。 我对此没有任何经验,但我强烈建议您查看this链接,因为它似乎解释了如何使用webViews在您的应用中加载网址。

我希望这能为你提供足够的答案并解决一些困惑!

<强> EDIT2:

我猜你有没有,要么初始化你的webView,要么在webView上设置contentView

所以请尝试替换

setContentView(<Arbitary Thing refering to most likely a layout>);

 WebView webview = new WebView(this);
 setContentView(webview);

由于您将引用其他布局,因此无法为TextView加载xml,因此我建议您删除

TextView uri = (TextView) findViewById(R.id.urlField);
 uri.setText(intentUri);

以及你可能在其他任何地方提及uri。

我还建议您阅读this链接中提供的示例,因为它看起来像是一个很好的起点。除此之外,只需尝试使用google进行WebView教程。

在第95行查看你的日志。在你的MainActivity中,某些东西返回null。如果我的建议不起作用,你能告诉我第95行的内容吗?

<强> EDIT3:

public class MainActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
       super.onCreate(savedInstanceState);
       WebView webview = new WebView(this);
       setContentView(webview);

       webView.loadUrl("http://www.google.com");

    }
}

并将其添加到标记

下方的Android清单中
<uses-permission android:name="android.permission.INTERNET" />

/ ********************************************** ************************ /

由于您是Android新手,请让我解释一下最有可能导致错误的原因:

当你这样做时

setContentView(R.id.layout_name);

R.id 的任何引用都将在 layout_name.xml 中查找,该文件由setContentView设置。因此,如果您有 layout_name_2.xml ,请说出 R.id.urlField_2 并尝试

TextView uri = (TextView) findViewById(R.id.urlField2);

它找不到R.id.urlField2,因为它没有在layout_name中定义。该活动仅查看 setContentView()中指定的布局。有一些方法可以组合布局,因此您可以在1个活动中使用多个xml,但这是另一天的主题。