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