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
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" /> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
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 <text>
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 <stdio.h> #include <stdlib.h> #include <string.h> #include <poll.h> #include <fcntl.h> #include <unistd.h> #include <sys/stat.h> #include <sys/types.h> #include "gpio.h" #define LOG_TAG "GPIO" #ifndef EXEC #include <android/log.h> #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 <jni.h> #include <stdlib.h> /* Header for class nativehelper_NativeGpio */ #include "gpio.h" #define LOG_TAG "GPIO" #ifndef HOST #include <android/log.h> #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