Get started with the native Adobe AIR extension for Android

I am completely unfamiliar with the development of the Android SDK. I am trying to run Adobe Reader from my own extension for AIR (on Android).

Here is what I did (I completed this lesson: http://www.adobe.com/devnet/air/articles/extending-air.html ).

I have a controller:

package com.tokom.adobereader { import com.tokom.adobereader.events.AdobeReaderEvent; import flash.events.EventDispatcher; import flash.events.StatusEvent; import flash.external.ExtensionContext; /** * A controller used to interact with the system volume on iOS and * Android devices. Ways to change the volume programmatically * and to respond to the hardware volume buttons are included. * * @author Nathan Weber */ public class AdobeReaderController extends EventDispatcher { //---------------------------------------- // // Variables // //---------------------------------------- private static var _instance:AdobeReaderController; private var extContext:ExtensionContext; //---------------------------------------- // // Public Methods // //---------------------------------------- public static function get instance():AdobeReaderController { if ( !_instance ) { _instance = new AdobeReaderController( new SingletonEnforcer() ); _instance.init(); } return _instance; } public function openPdf(path:String):void { trace("[AdobeReaderController.as] openPdf "+path); var ret = extContext.call( "openPdf", path ); trace("ret = "+ret); } /** * Cleans up the instance of the native extension. */ public function dispose():void { extContext.dispose(); } //---------------------------------------- // // Handlers // //---------------------------------------- private function init():void { trace("[AdobeReaderController.as] init"); extContext.call( "init" ); } //---------------------------------------- // // Handlers // //---------------------------------------- private function onStatus( event:StatusEvent ):void { //systemVolume = Number(event.level); //dispatchEvent( new VolumeEvent( VolumeEvent.VOLUME_CHANGED, systemVolume, false, false ) ); } //---------------------------------------- // // Constructor // //---------------------------------------- /** * Constructor. */ public function AdobeReaderController( enforcer:SingletonEnforcer ) { super(); extContext = ExtensionContext.createExtensionContext( "com.tokom.adobereader", "" ); if ( !extContext ) { trace("Adobe Reader native extension is not supported on this platform."); throw new Error( "Adobe Reader native extension is not supported on this platform." ); } //extContext.addEventListener( StatusEvent.STATUS, onStatus ); } } } class SingletonEnforcer { } 

And here is my openPdf () function:

 package com.tokom.adobereader.functions; import java.io.File; import android.app.Activity; import android.content.ActivityNotFoundException; import android.content.Context; import android.content.Intent; import android.media.AudioManager; import android.net.Uri; import android.util.Log; import com.adobe.fre.FREContext; import com.adobe.fre.FREFunction; import com.adobe.fre.FREObject; public class OpenPdfFunction extends Activity implements FREFunction { public static final String TAG = "OpenPdfFunction"; public FREObject call(FREContext context, FREObject[] args) { Log.d(TAG, "open pdf = "); String filePath = null; try { filePath = args[0].getAsString(); Log.d(TAG, filePath); } catch (Exception e) { // TODO } Log.d(TAG, "trying now to open adobeReader"); try { Intent intent = new Intent(); //intent.setClassName("com.adobe.reader", "com.adobe.reader.AdobeReader"); intent.setAction(Intent.ACTION_VIEW); intent.setDataAndType(Uri.fromFile(new File(filePath)), "application/pdf"); intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); Log.d(TAG, "about to startActivity"); startActivity(intent); } catch (ActivityNotFoundException activityNotFoundException) { Log.d(TAG, "cannot start activity"); activityNotFoundException.printStackTrace(); } catch (Exception otherException) { otherException.printStackTrace(); Log.d(TAG, "cannot start activity"); } Log.d(TAG, "activity should have started"); return null; } } 

The problem is that at runtime I get NPE (in startActivity ()):

 10-18 18:31:44.160: I/InputReader(289): dispatchTouch::touch event action is 0, pending(waiting finished signal)=0 10-18 18:31:44.160: I/InputDispatcher(289): Delivering touch to current input target: action: 0, channel '40b0d0b0 air.testMyANE.debug/air.testMyANE.debug.AppEntry (server)' 10-18 18:31:44.160: I/InputDispatcher(289): Delivering touch to current input target: action: 0, channel 'TouchIntercepter (server)' 10-18 18:31:44.280: I/InputReader(289): dispatchTouch::touch event action is 1, pending(waiting finished signal)=0 10-18 18:31:44.280: I/InputDispatcher(289): Delivering touch to current input target: action: 1, channel '40b0d0b0 air.testMyANE.debug/air.testMyANE.debug.AppEntry (server)' 10-18 18:31:44.280: I/InputDispatcher(289): Delivering touch to current input target: action: 1, channel 'TouchIntercepter (server)' 10-18 18:31:44.310: D/AdobeReaderExtension(28990): Extension initialized. 10-18 18:31:44.310: I/air.testMyANE.debug(28990): [AdobeReaderController.as] init 10-18 18:31:44.320: I/InitFunction(28990): in init 10-18 18:31:44.320: I/air.testMyANE.debug(28990): [AdobeReaderController.as] openPdf /sdcard/Download/test.pdf 10-18 18:31:44.320: D/OpenPdfFunction(28990): open pdf = 10-18 18:31:44.320: D/OpenPdfFunction(28990): /sdcard/Download/test.pdf 10-18 18:31:44.320: D/OpenPdfFunction(28990): trying now to open adobeReader 10-18 18:31:44.320: D/OpenPdfFunction(28990): about to startActivity 10-18 18:31:44.320: W/System.err(28990): java.lang.NullPointerException 10-18 18:31:44.320: W/System.err(28990): at android.app.Activity.startActivityForResult(Activity.java:3095) 10-18 18:31:44.320: W/System.err(28990): at android.app.Activity.startActivity(Activity.java:3201) 10-18 18:31:44.320: W/System.err(28990): at com.tokom.adobereader.functions.OpenPdfFunction.call(OpenPdfFunction.java:69) 10-18 18:31:44.320: W/System.err(28990): at com.adobe.air.customHandler.nativeOnTouchCallback(Native Method) 10-18 18:31:44.320: W/System.err(28990): at com.adobe.air.customHandler.nativeOnTouchCallback(Native Method) 10-18 18:31:44.320: W/System.err(28990): at com.adobe.air.customHandler.handleMessage(customHandler.java:27) 10-18 18:31:44.320: W/System.err(28990): at android.os.Handler.dispatchMessage(Handler.java:99) 10-18 18:31:44.320: W/System.err(28990): at android.os.Looper.loop(Looper.java:132) 10-18 18:31:44.320: W/System.err(28990): at android.app.ActivityThread.main(ActivityThread.java:4028) 10-18 18:31:44.320: W/System.err(28990): at java.lang.reflect.Method.invokeNative(Native Method) 10-18 18:31:44.320: W/System.err(28990): at java.lang.reflect.Method.invoke(Method.java:491) 10-18 18:31:44.320: W/System.err(28990): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:844) 10-18 18:31:44.320: W/System.err(28990): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:602) 10-18 18:31:44.320: W/System.err(28990): at dalvik.system.NativeStart.main(Native Method) 

I believe that as I try to start Adobe Reader, this is not very good, but what did I do wrong?

Thanks in advance for your help!

Zab

+7
source share
1 answer

Ok, I have my answer.

Instead of continuing the action in com.tokom.adobereader.functions.OpenPdfFunction, I did:

 Context appContext = context.getActivity().getApplicationContext(); // (...) appContext.startActivity(intent); 

Now it works.

Here is the complete code:

 package com.tokom.adobereader.functions; import java.io.File; import android.content.ActivityNotFoundException; import android.content.Context; import android.content.Intent; import android.net.Uri; import android.util.Log; import com.adobe.fre.FREContext; import com.adobe.fre.FREFunction; import com.adobe.fre.FREObject; public class OpenPdfFunction implements FREFunction { public static final String TAG = "OpenPdfFunction"; public FREObject call(FREContext context, FREObject[] args) { Context appContext = context.getActivity().getApplicationContext(); Log.d(TAG, "open pdf = "); String filePath = null; try { filePath = args[0].getAsString(); Log.d(TAG, filePath); } catch (Exception e) { // TODO } Log.d(TAG, "trying now to open adobeReader"); try { Intent intent = new Intent(); intent.setClassName("com.adobe.reader", "com.adobe.reader.AdobeReader"); intent.setAction(Intent.ACTION_VIEW); intent.setDataAndType(Uri.fromFile(new File(filePath)), "application/pdf"); intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); Log.d(TAG, "about to startActivity"); appContext.startActivity(intent); } catch (ActivityNotFoundException activityNotFoundException) { Log.d(TAG, "cannot start activity"); activityNotFoundException.printStackTrace(); } catch (Exception otherException) { otherException.printStackTrace(); Log.d(TAG, "cannot start activity"); } Log.d(TAG, "activity should have started"); return null; } } 

Hope this helps any other AIR developer in his first steps with the native extensions for Android.

Greetings!

+9
source

All Articles