I created simple app, which uses CastCompanionLibrary to stream video files to Google ChromeCast device. Everything seems to work fine, except I found that app crashes when booting phone without internet connection. I tried catch error on ADB monitor.
java.lang.RuntimeException: Unable to start receiver com.google.android.libraries.cast.companionlibrary.remotecontrol.VideoIntentReceiver: java.lang.IllegalStateException: No VideoCastManager instance was found, did you forget to initialize it?
What makes me wonder is, why my app is starting at phone boot at all? It was supposed to start only when user starts it.
However after some digging I believe it's something to do with CastCompanionLibrary mentioned before, which registers some service and receivers using manifest file.
Manifest.xml part
<activity
android:name="com.google.android.libraries.cast.companionlibrary.cast.player.VideoCastControllerActivity"
android:screenOrientation="portrait"
android:label="@string/app_name"
android:launchMode="singleTask"
android:parentActivityName="lv.test.myapp.MainActivity"
android:theme="@style/Theme.AppCompat.Light.NoActionBar">
<meta-data
android:name="android.support.PARENT_ACTIVITY"
android:value="lv.test.myapp.MainActivity" />
<intent-filter>
<action android:name="android.intent.action.MAIN" />
</intent-filter>
</activity>
<receiver android:name="com.google.android.libraries.cast.companionlibrary.remotecontrol.VideoIntentReceiver" >
<intent-filter>
<action android:name="android.media.AUDIO_BECOMING_NOISY" />
<action android:name="android.intent.action.MEDIA_BUTTON" />
<action android:name="com.google.android.libraries.cast.companionlibrary.action.toggleplayback" />
<action android:name="com.google.android.libraries.cast.companionlibrary.action.stop" />
</intent-filter>
</receiver>
<service
android:name="com.google.android.libraries.cast.companionlibrary.notification.VideoCastNotificationService"
android:exported="false" >
<intent-filter>
<action
android:name="com.google.android.libraries.cast.companionlibrary.action.notificationvisibility" />
</intent-filter>
</service>
<service
android:name="com.google.android.libraries.cast.companionlibrary.cast.reconnection.ReconnectionService"/>
<receiver android:name="com.google.android.gms.analytics.AnalyticsReceiver"
android:enabled="true">
<intent-filter>
<action android:name="com.google.android.gms.analytics.ANALYTICS_DISPATCH" />
</intent-filter>
</receiver>
Mainactivity part
public VideoCastManager mCastManager;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//id changed for public use
CastConfiguration options = new CastConfiguration.Builder("000000")
.enableAutoReconnect()
.enableLockScreen()
.enableWifiReconnection()
.enableNotification()
.build();
if(mCastManager == null) {
VideoCastManager.initialize(this, options);
}
mCastManager = VideoCastManager.getInstance();
//some other not related code here
}
Full error I found
04-07 22:12:32.185 5022-5022/? E/AndroidRuntime: FATAL EXCEPTION: main
Process: lv.test.myapp, PID: 5022
java.lang.RuntimeException: Unable to start receiver com.google.android.libraries.cast.companionlibrary.remotecontrol.VideoIntentReceiver: java.lang.IllegalStateException: No VideoCastManager instance was found, did you forget to initialize it?
at android.app.ActivityThread.handleReceiver(ActivityThread.java:3114)
at android.app.ActivityThread.access$1800(ActivityThread.java:181)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1551)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:145)
at android.app.ActivityThread.main(ActivityThread.java:6117)
at java.lang.reflect.Method.invoke(Native Method)
at java.lang.reflect.Method.invoke(Method.java:372)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1399)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1194)
Caused by: java.lang.IllegalStateException: No VideoCastManager instance was found, did you forget to initialize it?
at com.google.android.libraries.cast.companionlibrary.cast.VideoCastManager.getInstance(VideoCastManager.java:259)
at com.google.android.libraries.cast.companionlibrary.remotecontrol.VideoIntentReceiver.onReceive(VideoIntentReceiver.java:49)
at android.app.ActivityThread.handleReceiver(ActivityThread.java:3107)
at android.app.ActivityThread.access$1800(ActivityThread.java:181)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1551)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:145)
at android.app.ActivityThread.main(ActivityThread.java:6117)
at java.lang.reflect.Method.invoke(Native Method)
at java.lang.reflect.Method.invoke(Method.java:372)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1399)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1194)
04-07 22:12:32.200 2888-3384/? V/ApplicationPolicy: isApplicationStateBlocked userId 0 pkgname lv.test.myapp
Don't know what version of CCL you are using but if you are using a recent one, you should update your manifest to remove all intent filters from your receiver block and also the service. For the receiver, looks like someone else is trying to invoke your receiver so if you remove the intent filters, it will become private to your app and won't run into such issue.