GPS service for android and suggested changes in Necessitas.
Frameworks
frameworks at qlands.com
Mon Jun 6 11:49:30 CEST 2011
Sorry..
I did not see the soname commit.
Thanks.
On 06/06/2011 12:45 PM, Frameworks wrote:
> Hi,
>
> On more thing? How the load library problem gets fixed in Experimental?
>
> Thanks,
> Carlos.
>
> On 06/02/2011 03:10 PM, Frameworks wrote:
>> Hi,
>>
>> No problem.
>>
>> I am working on the GPS mobility plug-in (giving that there is a way
>> of having the JObject of the current activity running the QT
>> application).
>>
>> Cheers,
>> Carlos.
>>
>> On 06/01/2011 09:53 PM, BogDan wrote:
>>> Hi,
>>>
>>>
>>> Please accept my apologize for slow replay.
>>>
>>>> ________________________________
>>>> From: "frameworks at qlands.com"<frameworks at qlands.com>
>>>> To: necessitas-devel at kde.org
>>>> Sent: Sunday, May 29, 2011 10:58 AM
>>>> Subject: GPS service for android and suggested changes in Necessitas.
>>>>
>>>>
>>>>
>>>> Hi,
>>>>
>>>>
>>>>
>>>> First of all. Thanks for the brilliant work!.... Running QT in
>>>> Android is just mind-blowing!
>>>>
>>>>
>>>> I just joined the list of developers to contribute to the project.
>>>> Just after I got a copy of Necessitas 0.1 I had to see how to make
>>>> the GPS work. I wanted to implement it as most as possible with JNI
>>>> and with the minimum of java code.
>>> Great, we have something in common :)
>>>
>>>
>>>> From a GPS example written in Java
>>>> (http://hejp.co.uk/android/android-gps-example/) I got that the
>>>> main challenges were:
>>>> 1- To implement the LocationListener interface
>>>> 2- To connect to the location manager by
>>>> Activity.getSystemService(service)
>>>> 3- To request the locations using the Listener by
>>>> LocationManager.requestLocationUpdates(gps provider, double, float,
>>>> listener,looper)
>>>>
>>>> This main challenges arose from two main constraints:
>>>> 1- The LocationListener is an interface so needs to be implemented
>>>> in a class in a very basic way. Thus I had to include such
>>>> implementation as part of the industrius java classes:
>>>> QtGPSListener.java with the following implementation:
>>>>
>>>> package eu.licentia.necessitas.industrius;
>>>> import android.location.Location;
>>>> import android.location.LocationListener;
>>>> import android.location.LocationProvider;
>>>> import android.os.Bundle;
>>>> public class QtGPSListener implements LocationListener {
>>>> public void onLocationChanged(Location location)
>>>> {
>>>> // Here we get the location data and create a result
>>>> // string (A really basic way of passing data). We
>>>> called sndonLocationChanged that is
>>>> // in fact connected to the qt application by
>>>> JNI's registeNatives
>>>> String accuracy;
>>>> accuracy = String.valueOf(location.getAccuracy());
>>>> String altitude;
>>>> altitude = String.valueOf(location.getAltitude());
>>>> String latitude;
>>>> latitude = String.valueOf(location.getLatitude());
>>>> String longitude;
>>>> longitude = String.valueOf(location.getLongitude());
>>>> String res;
>>>> res = "|AC:" + accuracy;
>>>> res = res + "|AL:" + altitude;
>>>> res = res + "|LA:" + latitude;
>>>> res = res + "|LO:" + longitude + "|";
>>>> sndonLocationChanged(res);
>>>> }
>>>> public void onProviderDisabled(String provider) {
>>>> String res;
>>>> res = "Provider " + provider + " is disabled";
>>>> sndonProviderDisabled(res);
>>>> }
>>>> public void onProviderEnabled(String provider) {
>>>> String res;
>>>> res = "Provider " + provider + " is enabled";
>>>> sndonProviderEnabled(res);
>>>> }
>>>> public void onStatusChanged(String provider, int
>>>> status, Bundle extras) {
>>>> switch (status) {
>>>> case LocationProvider.OUT_OF_SERVICE:
>>>> sndonStatusChanged("Status Changed: Out of Service");
>>>> break;
>>>> case LocationProvider.TEMPORARILY_UNAVAILABLE:
>>>> sndonStatusChanged("Status Changed: Temporarily
>>>> Unavailable");
>>>> break;
>>>> case LocationProvider.AVAILABLE:
>>>> sndonStatusChanged("Status Changed: Available");
>>>> break;
>>>> }
>>>> }
>>>> // List of methods that will be linked in the qt application
>>>> // using JNI's registerNatives
>>>> public static native void sndonLocationChanged(String
>>>> currLocation);
>>>> public static native void sndonProviderDisabled(String
>>>> message);
>>>> public static native void sndonProviderEnabled(String
>>>> message);
>>>> public static native void sndonStatusChanged(String message);
>>>> }
>>>>
>>>> 2- I had to use the activity running the qt application so I can
>>>> use getSystemService(String). I though there were some Android API
>>>> to get an instance to the current activity running (so I can use
>>>> JNI to get it) but it seems that there is none.
>>> Actually it is, QtApplication.mainActivity()
>>>
>>>
>>>> So the only alternative that I had was to pass the activity from
>>>> QtApplication.java to qtmain_android.cpp. For this I made the
>>>> following changes:
>>>> 2.1 - In QtApplication.java: FROM: public static native void
>>>> startQtApp(String params,String env) TO: public static native void
>>>> startQtApp(String params,String env,Object currAct)
>>>> 2.2 - In qtmain_android.cpp: FROM: static jboolean
>>>> startQtApp(JNIEnv* env, jobject /*object*/, jstring paramsString,
>>>> jstring environmentString) TO: tatic jboolean startQtApp(JNIEnv*
>>>> env, jobject /*object*/, jstring paramsString, jstring
>>>> environmentString,jobject currAct)
>>>> 2.3 - In qtmain_android.cpp: I created a jobject currActivity =
>>>> NULL that I can extern in my sample application. Plus assigning it
>>>> a global reference of the current activity: currActivity =
>>>> env->NewGlobalRef(currAct). This to use it in JNI thread of execution
>>>>
>>> Hmm :)
>>>
>>>
>>>> With this changes I create a QT GPS class with JNI code that access
>>>> the GPS. I just need to pass it the JavaVM that I extern from
>>>> qtmain_android.cpp and currActivity.
>>>>
>>>>
>>>> I can see that in 0.2 necessitas include QtLocation.java (which
>>>> implements the GPS). Although it is fine, I reckon it is better to
>>>> implement much of that code in the c++ side with JNI and only have
>>>> the minimum java code just for implementing interfaces for example.
>>>>
>>> Agree with you !
>>>
>>>
>>>> This is an snapshot of the QT GPS class where it connects to the
>>>> service
>>>>
>>>>
>>> [...]
>>>
>>>> To conclude. A JNI implementation of the Android GPS service with
>>>> very basic java code will require to have a Jobject pointing to the
>>>> current activity running the QT application.
>>> Please call QtApplication.mainActivity() to get it !
>>>
>>>
>>>> This I reckon would make a Mobility plugin less dependent on
>>>> external java coding.
>>> It will be great, because the java part can't be updated, by
>>> Ministro service !
>>>
>>>
>>>> But where it would be the best place to implement this change? I
>>>> made it on qtmain_android.cpp and qtApplication.java but for a
>>>> Mobility plugin this might not be the case.
>>>>
>>> Please change current Mobility implementation ! You'll get Java_vm
>>> pointer when the plugin is loaded by application and
>>> QtApplication.mainActivity() is a static function which can be used
>>> to get current activity.
>>>
>>>
>>>> I register myself on gitorious. For contributing do I need to work
>>>> on a clone of master?
>>>>
>>> Please clone
>>> http://qt.gitorious.org/~taipan/qt-mobility/android-qt-mobility and
>>> use testing branch !
>>>
>>>
>>>>
>>>> Thanks a lot for the brilliant work!
>>>>
>>>>
>>>>
>>> Thanks,
>>>
>>> I'm looking forward to hearing from you
>>>
>>> Cheers,
>>> BogDan.
>>>
>>>
>>> Again, sorry for slow replay.
>>>
>>>
>>
>
More information about the Necessitas-devel
mailing list