====== Cordova ======
===== Install =====
Install nodejs and npm
sudo apt-get install nodejs npm
Install cordova
sudo npm install -g cordova
cordova need node and ubuntu install nodejs
sudo ln -s /usr/bin/nodejs /usr/local/bin/node
install cordova-browser from git to have linux support
sudo npm install -g git://git.apache.org/cordova-browser.git
===== Update =====
sudo npm update -g
===== Install Android SDK =====
Create /etc/etc/profile.d/android.sh or add in .bash_profile
export ANDROID_HOME=/lab/android-sdk-linux/
export PATH=$PATH:$ANDROID_HOME/tools:$ANDROID_HOME/platform-tools
===== Project =====
==== Create project ====
cordova create /lab/peper-memory org.csgalileo.peper.memory PeperMemory
Add android support
cd /lab/peper-memory
cordova platform list
cordova platforms add android
cordova platforms add browser
# temporary patch
# cp /usr/local/lib/node_modules/cordova-browser/bin/templates/project/cordova/run ./platforms/browser/cordova/run
Add to platforms/browser/cordova/run
case 'linux':
spawn('chromium-browser', ['--test-type', '--disable-web-security', '--user-data-dir=/tmp/temp_chrome_user_data_dir_for_cordova_browser', project]);
break;
==== Crosswalk ====
Optionally it is possible to use crosswalk instead of android webview
Add android platform to project
cordova platforms add android
Download [https://crosswalk-project.org/documentation/downloads.html|crosswalk]
CROSSWALK=/lab/crosswalk/crosswalk-cordova-10.39.235.15-arm
rm -fR platforms/android/CordovaLib/*
cp -a ${CROSSWALK}/framework/* platforms/android/CordovaLib/
cp -a ${CROSSWALK}/VERSION platforms/android/
Add to platforms/android/AndroidManifest.xml
Build both the CordovaLib and xwalk_core_library
cd platforms/android/CordovaLib/
android update project --subprojects --path . --target "android-19"
ant clean debug
cd .. # platforms/android/
rm -Rf ant-gen
rm -Rf ant-build
cd ../..
cordova build android
==== Manage project ====
View project detail
cordova info
Add plugins
cordova plugin add org.apache.cordova.device
cordova plugin add org.apache.cordova.console
# cordova plugin add https://github.com/donaldp24/CanvasCameraPlugin.git && cordova prepare
Search plugins
cordova plugin search
Update corbova inside project
cordova platform update android
==== Test project ====
cordova emulate browser
==== Release ====
cordova build --release android
[http://developer.android.com/tools/publishing/app-signing.html sign and align]
===== Video autoplay =====
Con ionic-crosswalk i video partono da soli con il set di src via javascript
if (! $('#video1')[0].src) {
$('#video1')[0].src = "http://...";
}
$("#video1")[0].currentTime = 0; // rewind
$("#video1")[0].play();
==== Cordova ====
CordovaApp.java
super.init();
super.appView.getSettings().setMediaPlaybackRequiresUserGesture(false);
==== Cordova Crosswalk ====
...
super.init();
getSettings(super.appView).setMediaPlaybackRequiresUserGesture(false);
...
/* rende plubblica la API mascherata dalle nuove release di crosswalk */
private XWalkSettings getSettings(XWalkView webView)
{
try
{
Method ___getBridge = XWalkView.class.getDeclaredMethod("getBridge");
___getBridge.setAccessible(true);
XWalkViewBridge xWalkViewBridge = null;
xWalkViewBridge = (XWalkViewBridge)___getBridge.invoke(webView);
XWalkSettings xWalkSettings = xWalkViewBridge.getSettings();
return xWalkSettings;
}
catch (Exception e)
{
e.printStackTrace();
}
return null;
}
Posizionare un set di src dopo il device ready
$('#video1')[0].src = "http://192.168.2.125:8000/lib/exe/fetch.php?media=contrade:pergari:pergari_int.webm";
===== GPIO =====
jni contain NDK project
├── Android.mk
├── gpio.c
├── gpio.h
└── jni_gpio.c
Rebuild this project running '''ndk-build into jni folde'''r
Android.mk
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := gpio_test
LOCAL_SRC_FILES := gpio.c
LOCAL_LDLIBS += -llog
LOCAL_CFLAGS += -DEXEC
include $(BUILD_EXECUTABLE)
include $(CLEAR_VARS)
LOCAL_MODULE := libgpio
LOCAL_SRC_FILES := gpio.c jni_gpio.c
LOCAL_LDLIBS += -llog
include $(BUILD_SHARED_LIBRARY)
gpio.c
#include
#include
#include
#include
#include
#include
#include
#include
#include "gpio.h"
#define LOG_TAG "GPIO"
#ifndef EXEC
#include
#define LOGD(...) __android_log_print(ANDROID_LOG_DEBUG,LOG_TAG,__VA_ARGS__)
#else
#define LOGD(...) printf(">==< %s >==< ",LOG_TAG),printf(__VA_ARGS__),printf("\n")
#endif
void on_new_value(int val);
int read_gpio(char *path, void (*callback)(int));
int main(int argc, char **argv){
LOGD("Hello!\n");
#ifdef HOST
return 0;
#endif
if(argc == 2)
return read_gpio(argv[1], on_new_value);
else
LOGD("missing argument path");
return -1;
}
int read_gpio(char *path, void (*callback)(int)){
int fd = open(path, O_RDONLY);
char buf[11];
int res = 0;
if(fd == -1){
perror("error opening file");
return -1;
}
struct pollfd gpio_poll_fd = {
.fd = fd,
.events = POLLPRI,
.revents = 0
};
for(;;){
res = poll(&gpio_poll_fd,1,-1);
if(res == -1){
perror("error polling");
break;
}
if((gpio_poll_fd.revents & POLLPRI) == POLLPRI){
LOGD("POLLPRI");
int off = lseek(fd, 0, SEEK_SET);
if(off == -1) break;
memset(&buf[0], 0, 11);
size_t num = read(fd, &buf[0], 10*sizeof(char));
callback(atoi(buf));
}
if((gpio_poll_fd.revents & POLLERR) == POLLERR){
//seems always to be true ..
//LOGD("POLLERR");
}
}
return 0;
}
void on_new_value(int val){
LOGD("interrupt received, val: %d", val);
}
gpio.h
#ifndef _GPIO_H_
#define _GPIO_H_
int read_gpio(char *path, void (*callback)(int));
#endif
jni_gpio.c
#include
#include
/* Header for class nativehelper_NativeGpio */
#include "gpio.h"
#define LOG_TAG "GPIO"
#ifndef HOST
#include
#define LOGD(...) __android_log_print(ANDROID_LOG_DEBUG,LOG_TAG,__VA_ARGS__)
#else
#define LOGD(...) printf(">==< %s >==< ",LOG_TAG),printf(__VA_ARGS__),printf("\n")
#endif
#ifndef _Included_nativehelper_NativeGpio
#define _Included_nativehelper_NativeGpio
#endif
#ifdef __cplusplus
extern "C" {
#endif
static void on_new_value(int val);
static jmethodID cb_method_id;
static jclass cb_class;
static jobject cb_object;
static JNIEnv *cb_save_env;
/*
* Class: csgalileo_NativeGpio
* Method: readGpio
* Signature: (Ljava/lang/String;Lcsgalileo/NativeGpio/GpioInterruptCallback;)V
*/
JNIEXPORT void JNICALL Java_csgalileo_NativeGpio_readGpio
(JNIEnv *env, jclass cls, jstring path, jobject callback){
cb_class = (*env)->GetObjectClass(env, callback);
if(cb_class == NULL){
LOGD("callback interface not found");
return;
}
cb_method_id = (*env)->GetMethodID(env, cb_class, "onNewValue", "(I)V");
if(cb_method_id == NULL){
LOGD("could not find callback method");
return;
}
cb_object = callback;
cb_save_env = env;
const char *fname = (*env)->GetStringUTFChars(env, path, NULL);
LOGD("path is %s", fname);
read_gpio((char *)fname, on_new_value);
(*env)->ReleaseStringUTFChars(env, path, fname);
}
static void on_new_value(int val){
LOGD("on_new_value interrupt received, val: %d", val);
(*cb_save_env)->CallVoidMethod(cb_save_env, cb_object, cb_method_id, (jint)val);
}
#ifdef __cplusplus
}
#endif