Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Start Activity from Adobe AIR native extension for Android

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

like image 506
Żabojad Avatar asked Oct 18 '12 16:10

Żabojad


1 Answers

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 !

like image 53
Żabojad Avatar answered Oct 22 '22 08:10

Żabojad