Статьи

Пример намерений с PhoneGap

В эти выходные я читал письмо по телефону, когда заметил что-то странное. Ссылка на статью в Википедии побудила меня спросить, хочу ли я загрузить ее в своем браузере или в приложении Википедии. Зная, что приложение Wikipedia было создано с помощью PhoneGap , я решил разобраться в этом и посмотреть, как это было сделано.

Я провел некоторое исследование и обнаружил, что (насколько я могу судить) приложение Wikipedia использует функцию Android под названием Intents . Насколько я понимаю, Intents — это способ для приложений …

  • Передайте общий запрос — то есть: «У меня есть адрес, и я хотел бы, чтобы кто-то сделал что-то необычное с ним!»
  • Прислушайтесь к общим просьбам — то есть: «Чувак, я могу делать потрясающие вещи с картами. Если у тебя есть адрес, дай мне знать, потому что я так сделаю с ним что-нибудь удивительное. Прекрасно».

Оказывается, для этого уже есть плагин: WebIntent . Чтобы использовать этот плагин, вы должны немного изменить код Java (я забыл добавить его в закладки, но здесь кто-то предоставил помощь), чтобы поддержать последнюю версию PhoneGap. Я включил копию в свою запись в блоге, поэтому не стесняйтесь просто скопировать ее оттуда. Но как только у вас установлен плагин, вы можете выполнить одно (или оба) из вышеуказанных действий.

Создать намерение так же просто, как использовать немного JavaScript:

window.plugins.webintent.startActivity({
action: WebIntent.ACTION_VIEW,
url: 'geo:0,0?q=' + 'new york'},
function() {},
function(e) {alert('Failed to open URL via Android Intent');}
);

 Но чтобы заставить ваше приложение прислушиваться к цели, требуется немного больше работы, в частности, изменение файла AndroidManifest.xml. Вам нужно добавить немного XML в это, чтобы зарегистрировать намерение, а также использовать JavaScript в вашем приложении, чтобы заметить, когда ваше приложение было запущено.

Через Stackoverflow я нашел эту запись при прослушивании ссылок на Youtube, а затем добавил ее в свой AndroidManifest.xml:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
      package="com.camden.intenttest"
      android:versionCode="1"
      android:versionName="1.0">

<uses-sdk android:minSdkVersion="10" />

<supports-screens
android:largeScreens="true"
android:normalScreens="true"
android:smallScreens="true"
android:resizeable="true"
android:anyDensity="true"
/>
<uses-permission android:name="android.permission.CAMERA" />
<uses-permission android:name="android.permission.VIBRATE" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_LOCATION_EXTRA_COMMANDS" />
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.RECEIVE_SMS" />
<uses-permission android:name="android.permission.RECORD_AUDIO" />
<uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS" />
<uses-permission android:name="android.permission.READ_CONTACTS" />
<uses-permission android:name="android.permission.WRITE_CONTACTS" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.GET_ACCOUNTS" />
<uses-permission android:name="android.permission.BROADCAST_STICKY" />

    <application android:label="@string/app_name" >
        <activity android:name="IntentTest"
                  android:label="@string/app_name" android:configChanges="orientation|keyboardHidden">
            <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"></action>
<category android:name="android.intent.category.DEFAULT"></category>
<category android:name="android.intent.category.BROWSABLE"></category>
<data android:host="www.youtube.com" android:scheme="http"></data>
</intent-filter>

</activity>

<activity android:name="org.apache.cordova.DroidGap" android:label="@string/app_name" android:configChanges="orientation|keyboardHidden">
<intent-filter></intent-filter>

</activity>

    </application>
</manifest>

 А потом я использовал немного JavaScript, чтобы заметить намерение.

<!DOCTYPE html>
<html>
<head>
<script src="cordova-1.6.1.js"></script>
<script src="webintent.js"></script>
<script>
function init() {
document.addEventListener("deviceready",deviceReady,false);
}

function deviceReady() {
console.log("Device Ready");

window.plugins.webintent.getUri(function(url) {
if(url !== "") {
// url is the url the intent was launched with
document.querySelector("#test").innerHTML = "URL was "+url;
}
});

}
</script>

</head>
<body onload="init()">

<h1>Test</h1>

<div id="test"></div>

</body>
</html>

 Просто, правда? После установки приложения я быстро открыл HTML-страницу с двумя ссылками. Один указывает на мой блог, другой на случайное видео на Youtube .

Когда я нажимаю ссылку на Youtube, я получаю это:

и если я выбираю свое собственное приложение, JavaScript, который я написал, замечает и отвечает на вызов:

Довольно просто! Я действительно едва затронул всю мощь и охват Intents, и я понятия не имею, существует ли что-то подобное для iOS (конечно, это должно быть), но в целом это невероятно легко использовать с PhoneGap.

Скачать прикрепленный файл