2016-11-13 67 views
1

我和Android: Cast SDK v3 Crashing in Release build only有几乎相同的问题。 关键的区别是,我的项目做它,而我只是在调试但它在这一行Android:设置媒体路由按钮时发生崩溃

CastButtonFactory.setUpMediaRouteButton(getApplicationContext(), mMediaRouteButton); 

我试图让我的所有变量公开,但并不做任何事情。完整的代码是

@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); 
} 

此外,我觉得它值得一提的是,此代码工作,我不能为我的生活找不出什么原因造成的停止工作。据我所知,当我在Android Studio中使缓存失效时停止工作。 这是我得到

错误
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)  

回答

2

这是固定通过使CastOptionsProvider公众。我不知道为什么会出现这个问题,因为直到它没有公开才公布,它工作的很好。我没有碰到它开始失败的构建上的CastOptionsProvider。 我CastOptionsProvider现在看起来是这样

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

我有完全相同的经验:'CastOptionsProvider'始终是包私有的,并且应用程序可以毫无问题地运行。然后有一天我开始看到这篇文章中引用的“无法初始化CastContext”'RuntimeException'。让'CastOptionsProvider'公开解决它。 –

2

有可能是你如何初始化媒体CastContext,正确初始化CastContext的问题,应用程序必须有工具OptionsProvider接口:

包com。示例。应用程序;

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

,并在AndroidManifest.xml与关键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" /> 
    ... 

注指定其全限定类名:所有的公共方法必须从主线程调用。

我做了一些研究,发现这种相关SO票,其讨论如何初始化CastContext:How to initialize CastContext outside of onCreate method

+0

是的,我已经有一个代码,我不认为它的初始化CastContext那失败。崩溃发生在这一行 CastButtonFactory.setUpMediaRouteButton(getApplicationContext(),mMediaRouteButton); 我从[link](https://developers.google.com/cast/docs/android_sender_integrate)获得了我的代码,所以它应该可以工作,直到我使android studio上的缓存失效。 –

2

如果这是在释放buildtype那么它是proguard的相关仅发生。请CastOptionsProvider类添加到ProGuard的文件,并重新检查

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

更多的安全,这些类也可以添加

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

你让我的一天!我搜遍了所有的代码,但最终的解决方案是将此行添加到我的proguard文件中。 '-keep class abc.xyz.videocast.CastOptionsProvider {*; }' – user4500