I'm completely new to development with Android SDK. I'm trying to start Adobe Reader from a native extension for AIR (on Android).
Here is what I did (I did follow this tutorial: 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 an NPE (on startActivity()) :
10-18 18:31:44.160: I/InputReader(289): dispatchTouch::touch event's 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's 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 the way I' try to start adobe reader is not the good one but what did I do wrong ?
Thanks in advance for your help !
Zab
OK, I have my answer.
Instead of extending Activity in com.tokom.adobereader.functions.OpenPdfFunction, I did :
Context appContext = context.getActivity().getApplicationContext();
// (...)
appContext.startActivity(intent);
It now works.
Here is the full 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 it will help any other AIR developer in his first steps with native extensions for Android.
Cheers !
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With