0

我正在创建一个本机扩展,该扩展显示来自基于 Flex 的 AIR 应用程序的本机 Google 地图。您可以观看 lee brimelow 的演示来了解这个想法: https: //plus.google.com/110495278155587072613/posts/degSYVx8423

我得到了一个原生扩展的工作演示,只是为了显示一个带有一些按钮的活动,但是当我试图显示地图时我卡住了。这是我在 setContentView(layoutID) 上遇到的异常:

    05-08 11:48:40.624: I/System.out(27917): WebViewActivity.onCreate 失败并出现错误:
    05-08 11:48:40.634: I/System.out(27917): "android.view.InflateException: Binary XML file line #9: Error inflating class fragment"
    05-08 11:48:40.644: W/dalvikvm(27917): threadid=1: 线程以未捕获的异常退出 (group=0x40fd8468)
    05-08 11:48:40.654:E/AndroidRuntime(27917):致命异常:主要
    05-08 11:48:40.654: E/AndroidRuntime(27917): java.lang.RuntimeException: 无法启动活动 ComponentInfo{air.GoogleMapsApp.debug/com.trasys.googlemaps.WebViewActivity}: java.lang.RuntimeException: Attempting创建多个 DataRequestDispatcher
    05-08 11:48:40.654: E/AndroidRuntime(27917): 在 android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2351)
    05-08 11:48:40.654: E/AndroidRuntime(27917): 在 android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2387)
    05-08 11:48:40.654: E/AndroidRuntime(27917): 在 android.app.ActivityThread.access$600(ActivityThread.java:151)
    05-08 11:48:40.654: E/AndroidRuntime(27917): 在 android.app.ActivityThread$H.handleMessage(ActivityThread.java:1331)
    05-08 11:48:40.654: E/AndroidRuntime(27917): 在 android.os.Handler.dispatchMessage(Handler.java:99)
    05-08 11:48:40.654: E/AndroidRuntime(27917): 在 android.os.Looper.loop(Looper.java:155)
    05-08 11:48:40.654: E/AndroidRuntime(27917): 在 android.app.ActivityThread.main(ActivityThread.java:5454)
    05-08 11:48:40.654: E/AndroidRuntime(27917): 在 java.lang.reflect.Method.invokeNative(Native Method)
    05-08 11:48:40.654: E/AndroidRuntime(27917): 在 java.lang.reflect.Method.invoke(Method.java:511)
    05-08 11:48:40.654: E/AndroidRuntime(27917): 在 com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1029)
    05-08 11:48:40.654: E/AndroidRuntime(27917): 在 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:796)
    05-08 11:48:40.654: E/AndroidRuntime(27917): at dalvik.system.NativeStart.main(Native Method)
    05-08 11:48:40.654:E/AndroidRuntime(27917):由:java.lang.RuntimeException:尝试创建多个 DataRequestDispatchers
    05-08 11:48:40.654: E/AndroidRuntime(27917): at maps.ak.nb(Unknown Source)
    05-08 11:48:40.654:E/AndroidRuntime(27917):在 maps.ak.na(未知来源)
    05-08 11:48:40.654: E/AndroidRuntime(27917): at maps.ak.ha(未知来源)
    05-08 11:48:40.654: E/AndroidRuntime(27917): at maps.af.wa(未知来源)
    05-08 11:48:40.654:E/AndroidRuntime(27917):在 maps.z.ab.a(未知来源)
    05-08 11:48:40.654:E/AndroidRuntime(27917):在 maps.z.ab.a(未知来源)
    05-08 11:48:40.654:E/AndroidRuntime(27917):在 maps.z.ag.a(未知来源)
    05-08 11:48:40.654:E/AndroidRuntime(27917):在 maps.z.ag.a(未知来源)
    05-08 11:48:40.654:E/AndroidRuntime(27917):在 maps.z.bw.a(未知来源)
    05-08 11:48:40.654: E/AndroidRuntime(27917): at maps.zronCreateView(Unknown Source)
    05-08 11:48:40.654: E/AndroidRuntime(27917): 在 com.google.android.gms.maps.internal.IMapFragmentDelegate$Stub.onTransact(IMapFragmentDelegate.java:107)
    05-08 11:48:40.654: E/AndroidRuntime(27917): 在 android.os.Binder.transact(Binder.java:326)
    05-08 11:48:40.654:E/AndroidRuntime(27917):在 com.google.android.gms.maps.internal.IMapFragmentDelegate$a$a.onCreateView(未知来源)
    05-08 11:48:40.654:E/AndroidRuntime(27917):在 com.google.android.gms.maps.MapFragment$b.onCreateView(未知来源)
    05-08 11:48:40.654: E/AndroidRuntime(27917): at com.google.android.gms.internal.e$4.a(未知来源)
    05-08 11:48:40.654: E/AndroidRuntime(27917): at com.google.android.gms.internal.ea(未知来源)
    05-08 11:48:40.654:E/AndroidRuntime(27917):在 com.google.android.gms.internal.e.onCreateView(未知来源)
    05-08 11:48:40.654:E/AndroidRuntime(27917):在 com.google.android.gms.maps.MapFragment.onCreateView(未知来源)
    05-08 11:48:40.654: E/AndroidRuntime(27917): 在 android.app.FragmentManagerImpl.moveToState(FragmentManager.java:809)
    05-08 11:48:40.654: E/AndroidRuntime(27917): 在 android.app.FragmentManagerImpl.moveToState(FragmentManager.java:1037)
    05-08 11:48:40.654: E/AndroidRuntime(27917): 在 android.app.FragmentManagerImpl.moveToState(FragmentManager.java:1019)
    05-08 11:48:40.654: E/AndroidRuntime(27917): 在 android.app.FragmentManagerImpl.dispatchActivityCreated(FragmentManager.java:1804)
    05-08 11:48:40.654: E/AndroidRuntime(27917): 在 android.app.Activity.performCreate(Activity.java:5069)
    05-08 11:48:40.654: E/AndroidRuntime(27917): 在 android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1101)
    05-08 11:48:40.654: E/AndroidRuntime(27917): 在 android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2307)
    05-08 11:48:40.654: E/AndroidRuntime(27917): ... 11 更多

我非常确信 AIR 和 Android 之间的通信是正常的,所以我只发布我的本机代码。(当我删除地图时,本机扩展可以正常工作)

这是布局xml文件

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:gravity="center_horizontal"
    android:orientation="vertical" >

    <fragment android:id="@+id/map"
        android:name="com.google.android.gms.maps.MapFragment"
        android:layout_width="match_parent"
        android:layout_height="300dp" />    
</LinearLayout>

这是我的 FREFunction

public class GoogleMapsFunction implements FREFunction {

@Override
public FREObject call(FREContext ctx, FREObject[] passedArgs) {
    int layoutID, googleMapID;
    Intent i = new Intent(ctx.getActivity(), WebViewActivity.class);

    layoutID = ctx.getResourceId("layout.activity_google_maps");
    googleMapID = ctx.getResourceId("id.map");

    i.putExtra("layoutID", layoutID);
    i.putExtra("googleMapID", googleMapID);

    ctx.getActivity().startActivity(i);
    return null;
    }
}

这是我的活动

public class WebViewActivity extends Activity {
    private GoogleMap map;

    @Override
    public void onCreate(Bundle savedInstanceState) {
       super.onCreate(savedInstanceState);

        try {
            int layoutID = getIntent().getIntExtra("layoutID", -1);
            setContentView(layoutID);
            int googleMapID = getIntent().getIntExtra("googleMapID", -1);
            map = ((MapFragment) getFragmentManager().findFragmentById(googleMapID))
                    .getMap();
        } catch(Exception e){
            System.out.printf("WebViewActivity.onCreate failed with error:\n\"%s\"\n",
                      e.toString());
            Toast.makeText(this, "WebViewActivity.onCreate failed: " +
                   e.toString(), Toast.LENGTH_SHORT).show();            
        }
    }
}

这是我的 AndroidManifest

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.trasys.googlemaps"
    android:versionCode="1"
    android:versionName="1.0" >

    <uses-sdk
        android:minSdkVersion="11"
        android:targetSdkVersion="17" />

    <permission android:name="com.example.helloworld.permission.C2D_MESSAGE" android:protectionLevel="signature" />
    <uses-permission android:name="com.example.helloworld.permission.C2D_MESSAGE" />

    <permission android:name="com.example.helloworld.permission.MAPS_RECEIVE" android:protectionLevel="signature"/>
    <uses-permission android:name="com.example.helloworld.permission.MAPS_RECEIVE"/>

    <!-- App receives GCM messages. -->
    <uses-permission android:name="com.google.android.c2dm.permission.RECEIVE" />
    <!-- GCM connects to Google Services. -->
    <uses-permission android:name="android.permission.INTERNET" /> 
    <!-- GCM requires a Google account. -->
    <uses-permission android:name="android.permission.GET_ACCOUNTS" />
    <!-- Keeps the processor from sleeping when a message is received. -->
    <uses-permission android:name="android.permission.WAKE_LOCK" />


    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
    <uses-permission android:name="com.google.android.providers.gsf.permission.READ_GSERVICES"/>
    <!-- The following two permissions are not required to use
    Google Maps Android API v2, but are recommended. -->
    <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>

    <uses-feature android:glEsVersion="0x00020000" android:required="true"/>

    <application
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name">
        <meta-data android:name="com.google.android.maps.v2.API_KEY" android:value="MyApiKey"/>
    </application>

</manifest>

我看到一些 com.google.android.gms。堆栈跟踪中的条目,所以我假设所有谷歌库都正确加载。

我创建了一个单独的纯原生 android 应用程序用于测试目的。在这个应用程序中,我设法创建了一个显示地图的活动,该活动使用相同的布局 XML、相同的谷歌库和相同的 API 密钥。

有任何想法吗?

4

1 回答 1

0

您需要在 jar 文件中包含第三方类,这就是为什么找不到片段类"Error inflating class fragment"的原因。

导出您的 java 文件后,使用任何 zip 工具(如 7-zip)打开 jar 文件,浏览到 com 文件夹并从第三方 jar 文件中复制包(打开方式相同)。之后,您将需要重新创建 ane 文件。

于 2013-07-29T16:21:30.330 回答