AIR for AndroidでのGoogle Maps for Flash

132 views
Skip to first unread message

セントナレッジ

unread,
Jun 30, 2011, 1:21:28 AM6/30/11
to AIR/Flash for Android
Flash Builder 4.5にて、AIR for Androidを構築中です。
Google Maps for Flashを使ってAndroid上にGoogleMapを表示させてますが、2点ほど困っている状況があります。

1.Google Mapの起動が非常に遅い。
クリックイベントで
<maps:Map xmlns:maps="com.google.maps.*"
id="map" width="90%" height="90%"
key="***********************"
mapevent_mapready="onMapReady();" sensor="true" url="http://
code.google.com/apis/maps/"/>
としていますが、表示までに30秒以上かかります。タイムアウトもしばしば。。でも一旦表示された後であれば、あとはスムーズな表示です。

2.地図が表示された後、マルチタッチでズームイン・アウトができない。
Multitouch.inputMode = MultitouchInputMode.TOUCH_POINT;
map.addEventListener(GestureEvent.GESTURE_TWO_FINGER_TAP, taphandler);
function taphandler(e:GestureEvent): void {
trace("touchTap");
}
で、トレースには何も出ない。マニフェストXMLファイルには、
<uses-feature android:required="true"
android:name="android.hardware.touchscreen.multitouch"/>
を記載済み。

SWCは、map_flex_1_20.swcです。
どなたかお心当たりのある方がいらっしゃったら、教示・参考サイトなど、教えていただければ幸いです。

akihiro kamijo

unread,
Jun 30, 2011, 8:02:35 PM6/30/11
to AF...@googlegroups.com
こんにちは。

> 1.Google Mapの起動が非常に遅い。
は、
http://code.google.com/p/gmaps-api-issues/issues/detail?id=2750
の63番目のコメントの方法が役に立つかも?しれません。

上条

masaaki

unread,
Jun 30, 2011, 9:23:17 PM6/30/11
to AIR/Flash for Android
こんにちは、岡本と申します。

1.Google Mapの起動が非常に遅い。

googlemapはデスクトップ向けに作られたものなのでモバイルにもってくるとやはり、遅さとか目立ってしまうと思います。
flash版は実測2,3秒ぐらいで表示できるのでそちらの利用はどうでしょうか。

2.地図が表示された後、マルチタッチでズームイン・アウトができない。
Multitouch.inputMode = MultitouchInputMode.TOUCH_POINT;

マルチタッチのモードをTOUCH_POINTで指定しているのでピンチズームなどの
ジェスチャーイベントを受け取る場合は
Multitouch.inputMode = MultitouchInputMode.GESTURE;
↑こう指定しなければいけません。

またジェスチャーイベントもTransformGestureEvent.GESTURE_ZOOM
を指定する必要があります。

以前に作ったサンプルコードがありましたので参考になれば幸いです。
※ActionScriptモバイルプロジェックト用のサンプルです。
※flash用のmap_1_20.swcを使っています。

下のサンプルをベースにつくったplaybook用のアプリもだしていますので
デバイスをお持ちであればプレビューできます。
http://appworld.blackberry.com/webstore/content/45769?lang=en

package
{
import com.google.maps.LatLng;
import com.google.maps.Map;
import com.google.maps.MapEvent;

import flash.display.Sprite;
import flash.display.StageAlign;
import flash.display.StageScaleMode;
import flash.events.Event;
import flash.events.MouseEvent;
import flash.events.TransformGestureEvent;
import flash.geom.Point;
import flash.ui.Multitouch;
import flash.ui.MultitouchInputMode;

public class SampleMap extends Sprite
{

public var map:Map;

public function SampleMap()
{
this.addEventListener(Event.ADDED_TO_STAGE,onInit);
}

protected function onInit(event:Event):void
{
stage.scaleMode = StageScaleMode.NO_SCALE;
stage.align = StageAlign.TOP_LEFT;

map = new Map();
map.key = "";
map.url = "";
map.sensor = "true";
map.setSize(new Point(stage.stageWidth,stage.stageHeight));
map.addEventListener(MapEvent.MAP_READY,onMapReady);


addChild(map);

if (Multitouch.supportsTouchEvents) {
Multitouch.inputMode = MultitouchInputMode.GESTURE;

map.addEventListener(TransformGestureEvent.GESTURE_ZOOM,onMapGestureZoom);
map.addEventListener(MouseEvent.MOUSE_UP,onMapMouseOut);
}else {
//マルチタッチ非対応時の処理
}
}

protected function onMapGestureZoom(e:TransformGestureEvent):void
{
map.disableDragging();
var ratio:Number = 1 + (e.scaleX -1)/20;
map.setZoom(map.getZoom()*ratio);
}
private function onMapMouseOut(e:MouseEvent):void{
map.enableDragging();
}
protected function onMapReady(e:Event):void
{
map.setCenter(new LatLng(35.68126, 139.76804),14);

セントナレッジ

unread,
Jun 30, 2011, 9:37:42 PM6/30/11
to AIR/Flash for Android
上条さん、岡本さん、ありがとうございます。

さっそく試してみます!必ずフィードバックしますね。


On 6月30日, 午後2:21, セントナレッジ <seijichish...@gmail.com> wrote:

セントナレッジ

unread,
Jul 1, 2011, 5:42:36 AM7/1/11
to AIR/Flash for Android
まず1.起動が遅い、のは解決出来ました!
上条さん、ほんとうにありがとうございました!!感謝・感謝です!

英語でしたので詳細までは掴めませんが、GoogleMapコードがSHA1でブロックされるようなことが書いてあり、
これを解除する??方法が書いてあるようです。多くの方が、これに悩んでいるようです。
以下、私が行った手順です。参考になれば幸いです。
Flash Builder 4.5のAIR、AIRモバイルに共通するかと思われます。

1.https://github.com/mikechambers/as3corelib/blob/master/src/com/adobe/
crypto/SHA1.as
から、asファイルをダウンロードする

2.SHA1.asを編集する
 ①import mx.core.FlexGlobals;を追記する

 ②hashBytes関数を、まるごと以下に置き換える
public static function hashBytes( data:ByteArray ):String
{
if (data.length ==
FlexGlobals.topLevelApplication.root.loaderInfo.bytes.length)
{
// Patch for AIR Google Maps
return "111122223333444455556666777788889999aaaa";
}

var blocks:Array = SHA1.createBlocksFromByteArray( data );
var byteArray:ByteArray = hashBlocks(blocks);

return IntUtil.toHex( byteArray.readInt(), true )
+ IntUtil.toHex( byteArray.readInt(), true )
+ IntUtil.toHex( byteArray.readInt(), true )
+ IntUtil.toHex( byteArray.readInt(), true )
+ IntUtil.toHex( byteArray.readInt(), true );
}


3.自分のプロジェクトのsrcフォルダを右クリックし、新規->パッケージを選択する

4.「com.adobe.crypto」という「名前」でパッケージフォルダ作成する

5.SHA1.asを、「com.adobe.crypto」にコピー(または移動)する。

6.<maps:Mapタグ内は、mapevent_mappreinitialize="onMapPreinitialize(event)" と
し、この関数にマップの初期設定を記述する。
 以下、例です)
private function onMapPreinitialize(event:Event):void {
var myMapOptions:MapOptions = new MapOptions();
myMapOptions.zoom = 14;
myMapOptions.center = new LatLng(PlaceLat, PlaceLng);
myMapOptions.mapType = MapType.NORMAL_MAP_TYPE;
this.map.setInitOptions(myMapOptions);
}

劇的に表示が速くなりました^^。
ありがとうございました!!

続いて、マルチタッチに挑戦します。

セントナレッジ

unread,
Jul 1, 2011, 10:04:54 AM7/1/11
to AIR/Flash for Android
岡本さん、ありがとうございました。

記載いただいたソースから、Flex用に抜粋し、見事マルチタッチでのズームイン・ズームアウトが出来ました!
ほんとうに大変参考になりました。御礼申し上げます!!

なお、Google Mapは、Flash版を使っておりました。
起動が遅かったのは、Flexであるせいなのかもしれません。
上条さんのアドバイスで、こちらも無事解決いたしました^^。

またよろしくお願い致します。

akihiro kamijo

unread,
Jul 3, 2011, 8:56:48 PM7/3/11
to AF...@googlegroups.com
役に立ってよかったです。

もし今月末の締め切りに間に合えば、AIR Contestに応募して下さ
い。<http://www.adobe.com/jp/joc/aircon2011/>
今年は応募数が少ないようなのでチャンス?

他の皆様もどうぞー。

上条

Reply all
Reply to author
Forward
0 new messages