2016-11-13 4 views
1

Je rencontre à peu près le même problème que Android: Cast SDK v3 Crashing in Release build only. La principale différence est que mon projet le fait alors que je suis juste le débogage et le fait sur cette ligneAndroid: Crash lors de la configuration du bouton route média

CastButtonFactory.setUpMediaRouteButton(getApplicationContext(), mMediaRouteButton); 

J'ai essayé de faire toutes mes variables publiques mais cela ne fait rien. Le code complet est

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 
    mMediaRouteButton = (MediaRouteButton) findViewById(R.id.media_route_button); 
    CastButtonFactory.setUpMediaRouteButton(getApplicationContext(), mMediaRouteButton); 

    mCastContext = CastContext.getSharedInstance(this); 

    mSelector = new MediaRouteSelector.Builder() 
      // These are the framework-supported intents 
      .addControlCategory(MediaControlIntent.CATEGORY_LIVE_AUDIO) 
      .addControlCategory(MediaControlIntent.CATEGORY_LIVE_VIDEO) 
      .addControlCategory(MediaControlIntent.CATEGORY_REMOTE_PLAYBACK) 
      .build(); 
    mMediaRouter = MediaRouter.getInstance(this); 
} 

Aussi je trouve utile de mentionner que ce code a fonctionné et je ne peux pas pour la vie de me comprendre ce qui a causé à cesser de travailler. Autant que je sache, il a cessé de fonctionner lorsque j'ai invalidé le cache dans Android Studio. Ce est l'erreur que je reçois

java.lang.RuntimeException: Unable to start activity ComponentInfo{mypackage.package/mypackage.package.MainActivity}: java.lang.IllegalStateException: Failed to initialize CastContext. 
    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2646) 
    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2707) 
    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.IllegalStateException: Failed to initialize CastContext. 
    at com.google.android.gms.cast.framework.CastContext.zzbb(Unknown Source) 
    at com.google.android.gms.cast.framework.CastContext.getSharedInstance(Unknown Source) 
    at com.google.android.gms.cast.framework.CastButtonFactory.setUpMediaRouteButton(Unknown Source) 
    at mypackage.package.MainActivity.onCreate(MainActivity.java:51) 
    at android.app.Activity.performCreate(Activity.java:6664) 
    at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1118) 
    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2599) 
    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2707)  
    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.IllegalAccessException: java.lang.Class<mypackage.package.CastOptionsProvider> is not accessible from java.lang.Class<com.google.android.gms.cast.framework.CastContext> 
    at java.lang.Class.newInstance(Native Method) 
    at com.google.android.gms.cast.framework.CastContext.zzbb(Unknown Source)  
    at com.google.android.gms.cast.framework.CastContext.getSharedInstance(Unknown Source)  
    at com.google.android.gms.cast.framework.CastButtonFactory.setUpMediaRouteButton(Unknown Source)  
    at mypackage.package.MainActivity.onCreate(MainActivity.java:51)  
    at android.app.Activity.performCreate(Activity.java:6664)  
    at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1118)  
    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2599)  
    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2707)  
    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)  

Répondre

2

Cela a été corrigé en faisant le public CastOptionsProvider. Je ne sais pas pourquoi ce problème est survenu au départ, car cela fonctionnait bien quand il n'était pas public jusqu'à ce qu'il ne fonctionne pas. Je n'ai pas touché le CastOptionsProvider sur la construction où il a commencé à échouer. Mon CastOptionsProvider ressemble maintenant à ce

public class CastOptionsProvider implements OptionsProvider { 
@Override 
public CastOptions getCastOptions(Context appContext) { 
    CastOptions castOptions = new CastOptions.Builder() 
      .setReceiverApplicationId(appContext.getString(R.string.app_id)) 
      .build(); 
    return castOptions; 
} 
@Override 
public List<SessionProvider> getAdditionalSessionProviders(Context context) { 
    return null; 
} 
} 
+0

J'ai eu exactement la même expérience: 'CastOptionsProvider' était toujours paquet-privé, et l'application fonctionnerait sans problème. Puis, un jour, j'ai commencé à voir le même "Echec de l'initialisation de CastContext" 'RuntimeException' référencé dans ce post. Rendre le 'CastOptionsProvider' public résolu. –

2

Il pourrait y avoir un problème sur la façon dont vous initialisez médias CastContext, pour initialiser correctement CastContext, l'application doit avoir les outils OptionsProvider interface:

package com.example .app;

public class CastOptionsProvider implements OptionsProvider { 
    @Override 
    public CastOptions getCastOptions(Context appContext) { 
     ... 
    } 
} 

et indiquer son nom complet de la classe dans la AndroidManifest.xml avec la touche OPTIONS_PROVIDER_CLASS_NAME_KEY:

... 
    <meta-data 
     android:name="com.google.android.gms.cast.framework.OPTIONS_PROVIDER_CLASS_NAME" 
     android:value="com.example.app.CastOptionsProvider" /> 
    ... 

Note: Toutes les méthodes publiques doivent être appelées à partir du thread principal.

je fait quelques recherches et trouvé ce lié SO ticket qui discuter comment initialiser CastContext: How to initialize CastContext outside of onCreate method

+0

Ouais, je l'ai déjà ce code et je ne pense pas que ça l'initialisation du CastContext que échoue. L'incident se produit sur cette ligne CastButtonFactory.setUpMediaRouteButton (getApplicationContext(), mMediaRouteButton); J'ai obtenu mon code à partir de [link] (https://developers.google.com/cast/docs/android_sender_integrate) donc ça devrait marcher, et ça a fonctionné jusqu'à ce que j'annule les caches sur le studio android. –

2

Si cela se produit uniquement dans la version buildtype il est lié à Proguard. S'il vous plaît ajouter la classe CastOptionsProvider au fichier proguard et revérifier

-keep class abc.xyz.videocast.CastOptionsProvider { *; } 

Pour plus de sécurité ces classes peuvent également être ajoutés

-keep class android.support.** { *; } 
-keep class com.google.** { *; } 
+1

Vous avez fait ma journée! J'ai cherché partout dans le code mais la solution finale était d'ajouter cette ligne à mon dossier de proguard. '-keep class abc.xyz.videocast.CastOptionsProvider {*; } ' – user4500