2016-09-09 4 views
9

私は位置認識アプリケーションを開発中です。アプリケーションにGoogle PlayロケーションサービスとGoogleマップを統合しました。私のアプリケーションは、デバッグモードで問題なく実行されます。私はこれは私がチェック私のフラグメントのonResumeメソッドで起こる各ライフサイクルメソッドで次のログに気づかSecurityException:署名付きAPKの不正なインターフェイスへのバインダー呼び出し

Process: com.example.akif, PID: 4233 
    java.lang.RuntimeException: Unable to resume activity {com.example.akif/com.example.akif.activities.MainActivity}: java.lang.SecurityException: Binder invocation to an incorrect interface 
    at android.app.ActivityThread.performResumeActivity(ActivityThread.java:3400) 
    at android.app.ActivityThread.handleResumeActivity(ActivityThread.java:3440) 
    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2713) 
    at android.app.ActivityThread.-wrap12(ActivityThread.java) 
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1460) 
    at android.os.Handler.dispatchMessage(Handler.java:102) 
    at android.os.Looper.loop(Looper.java:154) 
    at android.app.ActivityThread.main(ActivityThread.java:6077) 
    at java.lang.reflect.Method.invoke(Native Method) 
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:865) 
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:755) 
Caused by: java.lang.SecurityException: Binder invocation to an incorrect interface 
    at android.os.Parcel.nativeEnforceInterface(Native Method) 
    at android.os.Parcel.enforceInterface(Parcel.java:482) 
    at vz.onTransact(:com.google.android.gms.DynamiteModulesB:81) 
    at android.os.Binder.transact(Binder.java:499) 
    at com.google.android.gms.maps.a.bt.c(Unknown) 
    at com.google.android.gms.maps.i.b(Unknown) 
    at com.google.android.gms.b.d.b(Unknown) 
    at com.google.android.gms.b.j.a(Unknown) 
    at com.google.android.gms.maps.h.b(Unknown) 
    at com.google.android.gms.maps.h.a(Unknown) 
    at com.google.android.gms.b.a.c(Unknown) 
    at com.google.android.gms.b.a.e(Unknown) 
    at com.google.android.gms.maps.g.f(Unknown) 
    at android.support.v4.app.k.ay(Unknown) 
    at android.support.v4.app.x.l(Unknown) 
    at android.support.v4.app.ax.h(Unknown) 
    at android.support.v4.app.ax.i(Unknown) 
    at android.support.v4.app.ax.run(Unknown) 
    at android.support.v4.app.x.ae(Unknown) 
    at android.support.v4.app.i.aa(Unknown) 
    at android.support.v4.app.a.onPostResume(Unknown) 
    at android.support.v7.app.a.onPostResume(Unknown) 
    at android.app.Activity.performResume(Activity.java:6792) 
    at android.app.ActivityThread.performResumeActivity(ActivityThread.java:3377) 
    at android.app.ActivityThread.handleResumeActivity(ActivityThread.java:3440)  
    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2713)  
    at android.app.ActivityThread.-wrap12(ActivityThread.java)  
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1460)  
    at android.os.Handler.dispatchMessage(Handler.java:102)  
    at android.os.Looper.loop(Looper.java:154)  
    at android.app.ActivityThread.main(ActivityThread.java:6077)  
    at java.lang.reflect.Method.invoke(Native Method)  
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:865)  

:私はリリースモードで署名したAPKを生成し、アプリケーションを実行すると、以下の例外を除いて、起動時にクラッシュしますGoogleは、以下のようにサービスの可用性を再生する:

@Override public void onResume() { 
    Log.debug(getClass(), "onResume()"); 

    GoogleApiAvailability googleApiAvailability = GoogleApiAvailability.getInstance(); 

    int googlePlayServicesAvailabilityResult = googleApiAvailability.isGooglePlayServicesAvailable(getContext()); 

    if (googlePlayServicesAvailabilityResult != ConnectionResult.SUCCESS) { 
     if (!googleApiAvailability.isUserResolvableError(googlePlayServicesAvailabilityResult)) { 
      Toast.makeText(getContext(), "Your device doesn't support Google Play location services. This application cannot run without it!", Toast.LENGTH_LONG).show(); 

      getActivity().finish(); 

      return; 
     } 

     Dialog errorDialog = googleApiAvailability.getErrorDialog(getActivity(), googlePlayServicesAvailabilityResult, GOOGLE_PLAY_SERVICES_REQUEST_CODE); 

     if (errorDialog != null) { 
      errorDialog.setCancelable(false); 
      errorDialog.setCanceledOnTouchOutside(false); 
      errorDialog.setOnDismissListener((DialogInterface dialogInterface) -> { 
       Toast.makeText(getContext(), "You need Google Play location services to run this application!", Toast.LENGTH_LONG).show(); 

       getActivity().finish(); 
      }); 

      errorDialog.show(); 
     } 
    } else if (googleApiClient.isConnected() && !isUpdatingLocation) { 
     startLocationUpdates(); 
    } 

    super.onResume(); 
} 

マイGradleのファイルは、以下のようになります。

apply plugin: 'com.android.application' 

android { 
    compileSdkVersion 24 
    buildToolsVersion "24.0.1" 

    defaultConfig { 
     applicationId "com.example.akif" 
     minSdkVersion 15 
     targetSdkVersion 24 
     versionCode 1 
     versionName "0.1" 

     jackOptions { 
      enabled true 
     } 
    } 

    compileOptions { 
     sourceCompatibility JavaVersion.VERSION_1_8 
     targetCompatibility JavaVersion.VERSION_1_8 
    } 

    buildTypes { 
     debug { 
      applicationIdSuffix '.test' 
     } 

     release { 
      minifyEnabled true 
      proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' 
     } 
    } 
} 

dependencies { 
    compile fileTree(include: ['*.jar'], dir: 'libs') 
    compile 'com.android.support:appcompat-v7:24.2.0' 
    compile 'com.android.support:cardview-v7:24.2.0' 
    compile 'com.android.support:design:24.2.0' 
    compile 'com.android.support:preference-v7:24.2.0' 
    compile 'com.google.android.gms:play-services-location:9.4.0' 
    compile 'com.google.android.gms:play-services-maps:9.4.0' 
    compile 'com.github.mehmetakiftutuncu:toolbelt:1.1.0' 
    compile 'com.squareup.okhttp3:okhttp:3.4.1' 
    compile 'joda-time:joda-time:2.9.4' 
} 

私は2つのGoogle MapsのAPI kを持っています私のパッケージ名は、デバッグモードとリリースモードでそれぞれcom.example.akif.testcom.example.akifに設定されています。だから、パッケージ名には関係しないと思いますが、もう一度、私はエラーから何かを理解しなかったので、それは非常にうまくいくかもしれません。

何が起こっているのでしょうか?

+0

これは[this thread](http://stackoverflow.com/questions/24591282/securityexception-binder-invocation-to-an-incorrect-interface-using-in-app-bill)と似ています。 – noogui

+0

@nooguiしかし、そうではありません。私は請求サービスを使用していません。私はまた、AIDLファイルを持っていません。 –

答えて

2

ほとんどない結果と多くの研究を行った後、私は次のようProGuardのルールで問題を解決することができたが:

-keep public class com.google.android.gms.* { public *; } 
-dontwarn com.google.android.gms.** 

私はまだ私はこの問題を持っていた理由本当の理由を知っているが、それはありませんこれで修正されたようだ。

これが役に立ちます。

+1

あなたはあまりにも多くを保っています。 http://stackoverflow.com/a/39701449/94363を参照してください。 – rds

関連する問題