android自定义urlscheme..?
我试图创build自己的URLscheme,所以我的Android应用程序可以通过URL调用,但现在我没有成功。
我试图让这个url工作:cedemo://com.cedemo.scan?X = toto
这是我的清单文件的一部分:
<activity android:name=".Gallery1" android:label="@string/app_name" android:launchMode="singleTask" android:screenOrientation="portrait"> <intent-filter> <action android:name="android.intent.action.GALLERY" /> <category android:name="android.intent.category.DEFAULT" /> <category android:name="android.intent.category.BROWSABLE" /> <data android:scheme="cedemo" android:host="com.cedemo.scan" /> </intent-filter> </activity>
有没有人可以帮助告诉我什么是错的? 此外,如果有人发现什么是错的,有人可以告诉我如何从我的应用程序的Android代码内读取“X”variables?
更新:
更新:我做了行动的修改(如其中一个答案build议),它的工作正常。 事情是,我仍然无法获得urlvariables值。 这是我尝试的代码。
final Intent intent = getIntent(); final String myScheme=intent.getScheme(); final Bundle myBundle=intent.getExtras(); final boolean inContestKey; if (myBundle != null) { inContestKey=myBundle.containsKey("inContest"); } final Uri myURI=intent.getData(); final String value; if (myURI != null) { value = myURI.getQueryParameter("inContest"); }
但是,我从所有的function中收到null
…我还能做什么?
可能是我应该更好地解释我的软件的上下文:
- 我的软件已启动
- 我的软件启动,然后浏览器
- 用户点击浏览器中的链接,浏览器转到urlscheme,回到带有variables“X”的软件(例如)
- 该软件应该读取variables“X”
但在我的情况下: myScheme
, myBundle
, myURI
设置为null
。
有任何想法吗 ?
更新:
我发现答案是你必须在主要活动中这样做。
我认为问题出在你定义的行动上。 有一个“android.intent.action.VIEW”,这是我想你想要的。
<activity android:name=".Gallery1" android:label="@string/app_name" android:launchMode="singleTask" android:screenOrientation="portrait"> <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="cedemo" android:host="com.cedemo.scan" /> </intent-filter> </activity>
试试看,我敢打赌会正确解决。 我只做了这个假设,因为你包含浏览器通常使用的可浏览类别,它不知道你的任何自定义操作。 如果您确实需要GALLERY操作,那么只需创build2个filter即可
<activity android:name=".Gallery1" android:label="@string/app_name" android:launchMode="singleTask" android:screenOrientation="portrait"> <intent-filter> <action android:name="android.intent.action.GALLERY" /> <category android:name="android.intent.category.DEFAULT" /> <category android:name="android.intent.category.BROWSABLE" /> <data android:scheme="cedemo" android:host="com.cedemo.scan" /> </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="cedemo" android:host="com.cedemo.scan" /> </intent-filter> </activity>
因此,在您的活动内容中,您可以执行以下操作:
// Value should be "toto" as in your example String value = getData().getQueryParameter("X");
最后我修改了XML元素的顺序 。 具体而言,交换数据和动作行,以便数据在动作开始工作之前。
<intent-filter> <data android:scheme="myappname" /> <action android:name="android.intent.action.VIEW" /> <category android:name="android.intent.category.BROWSABLE" /> <category android:name="android.intent.category.DEFAULT" /> </intent-filter>
为了完整性,我在html中的链接是“myappname:// noop”。
还有一件事,我想扔光。 最初它不适合我,因为我在View / Default / Browsable / data之前使用Main / Launcher标签。
一旦我改变了顺序,它开始工作正常。 即最初不工作的代码
<intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </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="myapp" /> </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="myapp" /> </intent-filter> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter>
和testingAndroid的方法是非常简单的。 做任何HTML文件插入
<a href="myapp://http://www.google.com/">test to launch myapp</a> <br /><br />
只要打开这个HTML文件,并点击testing…. 🙂