2016-03-17 3 views

ответ

3

Это можно сделать, но вам нужно добавить ссылку на имя вашего класса приложения в элементе <application>AndroidManifest.xml. Один раз сделать это - использовать скрипт крюка after_prepare, чтобы применить его к манифесту после каждой операции подготовки Кордовы. Например:

plugin.xml

<plugin xmlns="http://www.phonegap.com/ns/plugins/1.0" 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    id="cordova-plugin-myplugin" 
    version="1.0.0"> 

    <name>My Plugin</name> 

    <platform name="android"> 

    <config-file target="config.xml" parent="/*"> 
     <feature name="MyPlugin" > 
     <param name="android-package" value="my.package.MyPlugin"/> 
     </feature> 
    </config-file> 

    <js-module name="MyPlugin" src="myplugin.js"> 
     <clobbers target="MyPlugin"/> 
    </js-module> 

    <source-file src="MyPlugin.java" target-dir="src/my/package" /> 
    <source-file src="MyApplication.java" target-dir="src/my/package" /> 

    <hook type="after_prepare" src="add_application_name.js" /> 

    </platform> 
</plugin> 

add_application_name.js

#!/usr/bin/env node 

module.exports = function(context) { 

    var APPLICATION_CLASS = "my.package.MyApplication"; 

    var fs = context.requireCordovaModule('fs'), 
     path = context.requireCordovaModule('path'); 

    var platformRoot = path.join(context.opts.projectRoot, 'platforms/android'); 
    var manifestFile = path.join(platformRoot, 'AndroidManifest.xml'); 

    if (fs.existsSync(manifestFile)) { 
    fs.readFile(manifestFile, 'utf8', function (err, data) { 
     if (err) { 
     throw new Error('Unable to find AndroidManifest.xml: ' + err); 
     } 

     if (data.indexOf(APPLICATION_CLASS) == -1) { 
     var result = data.replace(/<application/g, '<application android:name="' + APPLICATION_CLASS + '"'); 
     fs.writeFile(manifestFile, result, 'utf8', function (err) { 
      if (err) throw new Error('Unable to write into AndroidManifest.xml: ' + err); 
     }) 
     } 
    }); 
    } 
}; 

MyApplication.java

package my.package; 

import android.app.Application; 

public class MyApplication extends Application 
{ 
    public static final String TAG = "MyApplication"; 

    @Override 
    public void onCreate() 
    { 
     Log.d(TAG, "onCreate()"); 
     // DO SOME STUFF 
     super.onCreate(); 
    } 
} 
+0

Спасибо , Я попробую. Другой вопрос. Если можно передать некоторые значения через plugin.xml в мой java-файл, например MyApplication.java? –

+0

Ваш второй вопрос не имеет легкого ответа. Предполагая, что вы хотите использовать значения в 'onCreate()' вашего класса приложения, среда Cordova не была инициализирована на этом этапе, поэтому любой синтаксический анализ XML должен выполняться с Java. plugin.xml не копируется в 'platform/android', поэтому вам нужно создать ссылку, чтобы указать ее как исходный файл, который нужно скопировать в проект платформы. Затем вы можете анализировать и читать значения из этого класса приложений. – DaveAlden

+0

Какая переменная является 'appClass' на вашем крюке? Он выдает ошибку, и, похоже, он не определен в фрагменте кода. – SolveSoul

Смежные вопросы