Start Activity from Adobe AIR native extension for Android
Asked Answered
W

1

7

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

Weeper answered 18/10, 2012 at 16:42 Comment(0)
W
8

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 !

Weeper answered 19/10, 2012 at 14:19 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.