2016-11-13 70 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