2015-01-28 14 views
8

Ich entwickle eine mobile App mit Ionic Framework (basierend auf Cordova).Ionic/Cordova: Add Intent-Filter mit config.xml

In Android registriere ich meine App, um * .txt-Dateien zu öffnen. Ich mache das Hinzufügen von Intent-Filter in Plattformen/Android/AndroidManifest.xml und es funktioniert. Aber Plattformordner ist in .gitignore: Ich möchte es mit config.xml tun.

Ich habe versucht, in config.xml hinzu:

<platform name="android"> 
    <config-file target="AndroidManifest.xml" parent="/*/application/activity"> 
     <intent-filter><!-- ... --></intent-filter> 
    </config-file> 
    <!-- ... --> 
</platform> 

und ich versuchte auch das Hinzufügen:

<platform name="android"> 
    <config-file target="AndroidManifest.xml" parent="/manifest/application"> 
     <activity android:name="CordovaApp"> 
     <intent-filter><!-- ... --></intent-filter> 
     </activity> 
    </config-file> 
    <!-- ... --> 
</platform> 

Dann habe ich versucht AndroidManifest Start

ionic prepare 

Oder auch zu aktualisieren:

ionic remove platform android && ionic add platform android 

Aber AndroidManifest.xml ist immer unverändert. Was mache ich falsch?

Ich benutze Ionic 1.3.2 und Cordova 4.2.0.

bearbeiten Hier die gesamte config.xml:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?> 
<widget id="com.ionicframework.myapp551932" version="0.0.1" xmlns="http://www.w3.org/ns/widgets" xmlns:cdv="http://cordova.apache.org/ns/1.0" xmlns:android="http://schemas.android.com/apk/res/android"> 
    <name>MyApp</name> 
    <description> 
     myApp 
    </description> 
    <author email="[email protected]" href="http://www.example.com/"> 
     A Team 
    </author> 
    <content src="index.html"/> 
    <access origin="*"/> 
    <preference name="webviewbounce" value="false"/> 
    <preference name="UIWebViewBounce" value="false"/> 
    <preference name="DisallowOverscroll" value="true"/> 
    <preference name="BackupWebStorage" value="none"/> 
    <preference name="SplashScreen" value="screen"/> 
    <preference name="SplashScreenDelay" value="3000"/> 
    <feature name="StatusBar"> 
    <param name="ios-package" value="CDVStatusBar" onload="true"/> 
    </feature> 
    <platform name="android"> 
    <config-file target="AndroidManifest.xml" parent="/manifest/application/activity"> 
     <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" /> 
     <data android:mimeType="*/*" /> 
     <data android:pathPattern=".*\\.txt" /> 
     <data android:host="*" /> 
     </intent-filter> 
     <intent-filter> 
     <action android:name="android.intent.action.VIEW" /> 
     <category android:name="android.intent.category.DEFAULT" /> 
     <data android:scheme="content" /> 
     <data android:pathPattern=".*\\.txt" /> 
     <data android:mimeType="*/*" /> 
     </intent-filter> 
    </config-file> 
    <icon src="resources/android/icon/drawable-ldpi-icon.png" density="ldpi"/> 
    <icon src="resources/android/icon/drawable-mdpi-icon.png" density="mdpi"/> 
    <icon src="resources/android/icon/drawable-hdpi-icon.png" density="hdpi"/> 
    <icon src="resources/android/icon/drawable-xhdpi-icon.png" density="xhdpi"/> 
    <icon src="resources/android/icon/drawable-xxhdpi-icon.png" density="xxhdpi"/> 
    <icon src="resources/android/icon/drawable-xxxhdpi-icon.png" density="xxxhdpi"/> 
    <splash src="resources/android/splash/drawable-land-ldpi-screen.png" density="land-ldpi"/> 
    <splash src="resources/android/splash/drawable-land-mdpi-screen.png" density="land-mdpi"/> 
    <splash src="resources/android/splash/drawable-land-hdpi-screen.png" density="land-hdpi"/> 
    <splash src="resources/android/splash/drawable-land-xhdpi-screen.png" density="land-xhdpi"/> 
    <splash src="resources/android/splash/drawable-land-xxhdpi-screen.png" density="land-xxhdpi"/> 
    <splash src="resources/android/splash/drawable-land-xxxhdpi-screen.png" density="land-xxxhdpi"/> 
    <splash src="resources/android/splash/drawable-port-ldpi-screen.png" density="port-ldpi"/> 
    <splash src="resources/android/splash/drawable-port-mdpi-screen.png" density="port-mdpi"/> 
    <splash src="resources/android/splash/drawable-port-hdpi-screen.png" density="port-hdpi"/> 
    <splash src="resources/android/splash/drawable-port-xhdpi-screen.png" density="port-xhdpi"/> 
    <splash src="resources/android/splash/drawable-port-xxhdpi-screen.png" density="port-xxhdpi"/> 
    <splash src="resources/android/splash/drawable-port-xxxhdpi-screen.png" density="port-xxxhdpi"/> 
    </platform> 
    <icon src="resources/android/icon/drawable-xhdpi-icon.png"/> 
</widget> 
+0

Können Sie zeigen Sie Ihre gesamte 'config.xml' oder zumindest den Header der XML-Datei: Das in ES6 ist, können Sie eine ES5-Version finden Sie hier? –

+0

Hier ist es (alles von Ionic außer Config-Datei-Tag hinzugefügt). –

Antwort

16

Gelöst!

ich es nicht tun kann ionische oder Cordova mit: es ist eine PhoneGap-Funktion (siehe dieses Stackoverflow answer)

ich es auf zwei anderen Arten tun:

  1. eine eigene Cordova-Plugin verwende
  2. Mit einem Haken

Ich bevorzugte den zweiten Weg. Ich habe eine interesting hook für meine Zwecke gefunden. Hinweis: Rembember einige Pakete zu installieren:

npm install lodash elementtree plist --save-dev 

Leider dieser Haken verschmilzt Tags. Also schrieb ich eine kleine geänderte Version dieses Hakens: see here. Sie können diesen Haken in/hooks/after_platform_add setzen.

Jetzt habe ich meine Absicht-Filterkonfiguration in config.xml:

<platform name="android"> 
    <config-file target="AndroidManifest.xml" parent="application/activity"> 
     <intent-filter><!-- ... --></intent-filter> 
    </config-file> 
    <!-- ... --> 
    </platform> 

Und ich kann aktualisieren AndroidManifest.xml Android-Plattform zu regenerieren:

ionic platform remove android && ionic platform add android 
+0

Hook-Code ist nicht verfügbar. Warum nicht GitHubs Geiste verwenden? – neoascetic

+1

Ok. In GitHubs Geiste verschoben :) –

+0

Danke dafür – pgorsira

5

ich hatte das gleiche Problem, aber die Die Idee, eine Reihe von npm-Abhängigkeiten zu installieren (und dann die Abhängigkeit zu merken oder zu dokumentieren) und dann einen großen Universal-Hook zu verwenden, war viel zu schwer für das, was ich brauchte.

Hooks können einfache Shell-Skripte sein, die oft eine viel einfachere Möglichkeit zum Ändern von Textdateien sind.In meinem Fall musste ich nur einen Intent-Filter zur MainActivity Aktivität hinzufügen, was ein trivialer Job für sed ist; Ich habe gerade die Datei hooks/after_prepare/020_add_moozvine_intents.sh mit dem Inhalt:

#!/usr/bin/env zsh 

MANIFEST=${0:h}/../../platforms/android/AndroidManifest.xml 
[[ -e $MANIFEST ]] || { print "Manifest not found at $MANIFEST." ; exit 1; } 

grep -q HANDLE_MOOZVINE_NOTIFICATION $MANIFEST && { print "Manifest already modified. Nothing to do."; exit 0; } 

AFTER_LINE='android:name="MainActivity"' 
ADDITION='\ 
     <intent-filter>\ 
      <action android:name="HANDLE_MOOZVINE_NOTIFICATION" />\ 
      <category android:name="android.intent.category.DEFAULT" />\ 
     </intent-filter> 
'; 

sed -i -e "/${AFTER_LINE}/a${ADDITION}" $MANIFEST 

Job gemacht. Sie können einen ähnlichen Ansatz für einfache Textänderungen an generierten Dateien verwenden.

+0

Ich suchte diese Antwort für Stunden. Danke für das Teilen hier. Ich konnte nicht daran denken, weil ich Shell-Skripte nicht kannte, aber ... es funktioniert gut, vielen Dank! –

5

Hier ist die obige Lösung von Rich in JS für zukünftige Googler geschrieben, da ich Probleme mit dem Shell-Skript hatte.

module.exports = function (context) { 
    const fs = require('fs'); 
    const _ = require('lodash'); 

    const scheme = 'flowkey'; 
    const insertIntent = ` 
    <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:scheme="${scheme}"></data> 
    </intent-filter> 
    `; 
    const manifestPath = context.opts.projectRoot + '/platforms/android/AndroidManifest.xml'; 
    const androidManifest = fs.readFileSync(manifestPath).toString(); 
    if (!androidManifest.includes(`android:scheme="${scheme}"`)) { 
     const manifestLines = androidManifest.split(/\r?\n/); 
     const lineNo = _.findIndex(manifestLines, (line) => line.includes('@string/activity_name')); 
     manifestLines.splice(lineNo + 1, 0, insertIntent); 
     fs.writeFileSync(manifestPath, manifestLines.join('\n')); 
    } 
}; 

Verwenden Sie dies als Ihren nachbereiten Haken.

Hinweis: https://gist.github.com/smowden/f863331034bf300b960beef1ae25bf82

+0

Diese Lösung funktionierte gut für mich, wenn ich das Skript in Skripte/cordova/hooks/android legte und den entsprechenden after_prepare-Hook in config.xml hinzufügte –

Verwandte Themen