

現在cordovaにて、androidアプリの勉強をしています。  
cordova-plugin-googlemapsを利用して地図アプリを作成中なのですが、  
広告表示のためcordova-plugin-admobproを入れたところ、  
以下のようなエラーが出てしまい、ビルドできなくなってしまいます。

[code]

    Error: cmd: Command failed with exit code 1 Error output:
    
    C:\Users\name\app\platforms\android\src\plugin\google\maps\PluginUtil.java:135: 
    *G***[: AbstractSafeParcelable*ɃA*N*Z*X******* 
         Builder builder = LatLngBounds.builder();
                                      ^
    com.google.android.gms.common.internal.safeparcel.AbstractSafeParcelable**N***X*E*t*@*C*********
    
    
    FAILURE: Build failed with an exception.
    
    * What went wrong:
    Execution failed for task ':compileDebugJavaWithJavac'.
    > Compilation failed; see the compiler error output for details.
    
    * Try:
    Run with --stacktrace option to get the stack trace. Run with --info or --debug
    option to get more log output.
    
[/code]

ちなみに、エラーがでるのは、  
cordova-plugin-googlemapsとcordova-plugin-admobpro  
両方入れた時だけで、どちらかだけの場合は、ちゃんとビルドできます。

素人な私なりに考えてみましたが、たぶん  
Builder builder = LatLngBounds.builder();  
これが原因なのかと思うのですが・・・  
その場合はこれをどうすれば良いのでしょうか？  
また他に何か原因があるのでしょうか？

分かる方がいましたら、ぜひお願いします。  
初心者でも分かるようご教授くださいませm(__)m


CC BY-SA 3.0
2017-03-08T01:43:55.487
33177
2021-03-03T13:03:20.317
2017-03-08T03:22:04.277
20272
20967
question
android cordova
cordova-plugin-googlemapsとcordova-plugin-admobproのプラグインを入れるとビルドエラーが発生する


本家StackOverflowに[類似の質問](https://stackoverflow.com/questions/41030573/ionic-v2-google-
maps-api-android-build-error-cannot-access-abstractsafeparcelab)がありました。

`/platforms/android/project.properties`を以下のように書き換えることで解決するようです。  
こちらの環境で試したところビルドエラーは発生しなくなりました。

・9.8.0の指定を+に変更する

[code]

    #cordova.system.library.4=com.google.android.gms:play-services-maps:9.8.0
    #cordova.system.library.5=com.google.android.gms:play-services-location:9.8.0
    cordova.system.library.4=com.google.android.gms:play-services-maps:+
    cordova.system.library.5=com.google.android.gms:play-services-location:+
    
[/code]

エラーが出ている原因を説明すると`cordova-plugin-googlemaps`は依存するライブラリとして`play-services-
maps`と`play-services-location`がありますが、それらのバージョンを9.8.0と固定で指定しています。  
一方`cordova-plugin-admobpro`は`com.google.android.gms:play-services-
ads:+`の様に依存するライブラリにバージョンは指定していません。  
これらのライブラリの利用しているバージョンの差異があるため、ライブラリ内で利用しているクラスがバージョンによっては実装されていたりいなかったりし、以下の様なクラスが見つからないというエラーが発生しています。

[code]

    class file for com.google.android.gms.common.internal.safeparcel.AbstractSafeParcelable not found
    
[/code]

但し、この解決方法は強引な手法でもあります。  
`cordova-plugin-googlemaps`のプラグインは依存するライブラリのバージョンを9.8.0と指定しています。  
これは9.8.0ではある程度問題なく動作することがわかっているが、それ以降のバージョンで動作するかはわからないためです。  
よってこの解決方法を用いた場合は、バージョン指定を削除した`cordova-plugin-googlemaps`のAPIが正しく動作しない可能性があります。  
（問題なく動作する可能性もあるので、利用してみて問題が発生しなければそのままでも良いでしょう）  
またこの問題はいずれプラグイン側が修正されて解決すると思われます。

* * *

追記

個人的な意見になるかもしれませんが、`/platforms/android/project.properties`を手動で修正することは避けるべきです。  
なぜなら/platforms/配下はcordovaによって管理されており、ファイルの生成/変更/削除が様々なタイミングで自動的に行われるからです。  
今回の例でいうならば`cordova-plugin-
googlemaps`のプラグインをインストールしたタイミングで`/platforms/android/project.properties`が自動で変更されています。

なのでプラグインのライブラリバージョンの指定を変更して適用するには

  1. 元のプラグインをforkして新しいリポジトリを作る
  2. 問題のある箇所を修正する  
今回の場合：`cordova-plugin-googlemaps/plugin.xml`を修正する

[code]     <!-- <framework src="com.google.android.gms:play-services-
maps:9.8.0" /> -->

    <!-- <framework src="com.google.android.gms:play-services-location:9.8.0" /> -->
    <framework src="com.google.android.gms:play-services-maps:+" />
    <framework src="com.google.android.gms:play-services-location:+" />
    
[/code]

  3. forkしたリポジトリのプラグインを適用する
[code]     cordova plugin install https://github.com/fork-my-plugin/cordova-
plugin-googlemaps --variable
API_KEY_FOR_ANDROID="YOUR_ANDROID_API_KEY_IS_HERE" --variable
API_KEY_FOR_IOS="YOUR_IOS_API_KEY_IS_HERE"

    
[/code]

のように適用した方が良いでしょう。  
1.についてはローカルにcloneで落としてきてそれを修正するのもありかと思います。  
その場合はソース管理の仕方を少し考える必要がありそうですが。


CC BY-SA 3.0
2017-03-08T03:18:21.023
33180
2017-03-08T05:37:13.993
2017-05-23T12:38:56.467
-1
20272
33177
answer