Android:在发布版本中未检测到 Cast SDK v3 CastOptionsProvider
Android: Cast SDK v3 CastOptionsProvider not detected in release build
我已经正确声明了 CastOptiponsProvider manifest.xml
<meta-data
android:name="com.google.android.gms.cast.framework.OPTIONS_PROVIDER_CLASS_NAME"
android:value="org.lao.yao.kd.cast.CastOptionsProvider" />
无论如何,我只有在构建要发布的应用程序时才会收到此错误消息:
java.lang.ClassNotFoundException: org.lao.yao.kd.cast.CastOptionsProvider
这是我的 CastOptionsProvider class:
public class CastOptionsProvider implements OptionsProvider {
@Override
public CastOptions getCastOptions(Context context) {
NotificationOptions notificationOptions = new NotificationOptions.Builder()
.setActions(Arrays.asList(MediaIntentReceiver.ACTION_SKIP_NEXT,
MediaIntentReceiver.ACTION_TOGGLE_PLAYBACK,
MediaIntentReceiver.ACTION_STOP_CASTING), new int[]{1, 2})
.setTargetActivityClassName(ExpandedControlsActivity.class.getName())
.build();
CastMediaOptions mediaOptions = new CastMediaOptions.Builder()
.setImagePicker(new ImagePickerImpl())
.setNotificationOptions(notificationOptions)
.setExpandedControllerActivityClassName(ExpandedControlsActivity.class.getName())
.build();
return new CastOptions.Builder()
.setReceiverApplicationId(MyJsonConfig.getPrefString(MyJsonConfig.KEY_CHROMECAST_RECEIVER_ID, context) )
.setCastMediaOptions(mediaOptions)
.build();
}
@Override
public List<SessionProvider> getAdditionalSessionProviders(Context appContext) {
return null;
}
private static class ImagePickerImpl extends ImagePicker {
@Override
public WebImage onPickImage(MediaMetadata mediaMetadata, int type) {
if ((mediaMetadata == null) || !mediaMetadata.hasImages()) {
return null;
}
List<WebImage> images = mediaMetadata.getImages();
if (images.size() == 1) {
return images.get(0);
} else {
if (type == ImagePicker.IMAGE_TYPE_MEDIA_ROUTE_CONTROLLER_DIALOG_BACKGROUND) {
return images.get(0);
} else {
return images.get(1);
}
}
}
}
}
我的发布版本也使用混淆器。
我 运行 之前使用 Proguard 和外部库(尤其是 Google 的东西)解决过这个问题。我在 proguard-rules.pro
文件中使用了以下内容:
-keep class org.lao.yao.kd.cast.CastOptionsProvider { *; }
还有你的 CastIntentReceiver。
-keep class org.lao.yao.kd.cast.CastIntentReceiver { *; }
为了更好的衡量,我还添加了这些行:
-keep class android.support.** { *; }
-keep class com.google.** { *; }
-keep class java.nio.file.** { *; }
我已经正确声明了 CastOptiponsProvider manifest.xml
<meta-data
android:name="com.google.android.gms.cast.framework.OPTIONS_PROVIDER_CLASS_NAME"
android:value="org.lao.yao.kd.cast.CastOptionsProvider" />
无论如何,我只有在构建要发布的应用程序时才会收到此错误消息:
java.lang.ClassNotFoundException: org.lao.yao.kd.cast.CastOptionsProvider
这是我的 CastOptionsProvider class:
public class CastOptionsProvider implements OptionsProvider {
@Override
public CastOptions getCastOptions(Context context) {
NotificationOptions notificationOptions = new NotificationOptions.Builder()
.setActions(Arrays.asList(MediaIntentReceiver.ACTION_SKIP_NEXT,
MediaIntentReceiver.ACTION_TOGGLE_PLAYBACK,
MediaIntentReceiver.ACTION_STOP_CASTING), new int[]{1, 2})
.setTargetActivityClassName(ExpandedControlsActivity.class.getName())
.build();
CastMediaOptions mediaOptions = new CastMediaOptions.Builder()
.setImagePicker(new ImagePickerImpl())
.setNotificationOptions(notificationOptions)
.setExpandedControllerActivityClassName(ExpandedControlsActivity.class.getName())
.build();
return new CastOptions.Builder()
.setReceiverApplicationId(MyJsonConfig.getPrefString(MyJsonConfig.KEY_CHROMECAST_RECEIVER_ID, context) )
.setCastMediaOptions(mediaOptions)
.build();
}
@Override
public List<SessionProvider> getAdditionalSessionProviders(Context appContext) {
return null;
}
private static class ImagePickerImpl extends ImagePicker {
@Override
public WebImage onPickImage(MediaMetadata mediaMetadata, int type) {
if ((mediaMetadata == null) || !mediaMetadata.hasImages()) {
return null;
}
List<WebImage> images = mediaMetadata.getImages();
if (images.size() == 1) {
return images.get(0);
} else {
if (type == ImagePicker.IMAGE_TYPE_MEDIA_ROUTE_CONTROLLER_DIALOG_BACKGROUND) {
return images.get(0);
} else {
return images.get(1);
}
}
}
}
}
我的发布版本也使用混淆器。
我 运行 之前使用 Proguard 和外部库(尤其是 Google 的东西)解决过这个问题。我在 proguard-rules.pro
文件中使用了以下内容:
-keep class org.lao.yao.kd.cast.CastOptionsProvider { *; }
还有你的 CastIntentReceiver。
-keep class org.lao.yao.kd.cast.CastIntentReceiver { *; }
为了更好的衡量,我还添加了这些行:
-keep class android.support.** { *; }
-keep class com.google.** { *; }
-keep class java.nio.file.** { *; }