Чтобы дать суть сценария. Я использую exoplayer для воспроизведения видео и функции трансляции. Когда я нажимаю кнопку трансляции, у меня появляется
mediaClient.registerCallback(new RemoteMediaClient.Callback() {
@Override
public void onStatusUpdated() {
Intent intent = new Intent(VideoPlayer.this, ExpandedControlActivity.class);
startActivity(intent);
mediaClient.unregisterCallback(this);
}
@Override
public void onMetadataUpdated() {
super.onMetadataUpdated();
}
});
, как в примере приложения. Вот как я создаю свою mediaInfo
private MediaInfo buildMediaInfo(long playbackPositionMs, String thumbnailImage) {
MediaMetadata movieMetadata = new MediaMetadata(MediaMetadata.MEDIA_TYPE_MOVIE);
movieMetadata.putString(MediaMetadata.KEY_TITLE, videoTitle);
movieMetadata.addImage(new WebImage(Uri.parse(thumbnailImage)));
try {
return new MediaInfo.Builder(videoUrl)
.setStreamType(MediaInfo.STREAM_TYPE_BUFFERED)
.setContentType(isMp4(videoUrl)?"mp4":"hls")
.setMetadata(movieMetadata)
.setStreamDuration(playbackPositionMs)
.build();
} catch (Exception e) {
return new MediaInfo.Builder(videoUrl)
.setStreamType(MediaInfo.STREAM_TYPE_BUFFERED)
.setContentType(isMp4(videoUrl)?"mp4":"hls")
.setMetadata(movieMetadata)
.setStreamDuration(0)
.build();
}
}
Я не уверен, почему, но как только я нажимаю кнопку трансляции, я получаю это исключение
E/SQLiteDatabase: Error inserting flex_time=3575000 job_id=-1 period=7152000 source=16 requires_charging=0 preferred_network_type=1 target_class=com.google.android.gms.measurement.PackageMeasurementTaskService user_id=0 target_package=com.google.android.gms tag=Measurement.PackageMeasurementTaskService.UPLOAD_TASK_TAG task_type=0 required_idleness_state=0 service_kind=0 source_version=202614000 persistence_level=1 preferred_charging_state=1 required_network_type=0 runtime=1596608957468 retry_strategy={"maximum_backoff_seconds":{"3600":0},"initial_backoff_seconds":{"30":0},"retry_policy":{"0":0}} last_runtime=0
android.database.sqlite.SQLiteConstraintException: UNIQUE constraint failed: pending_ops.tag, pending_ops.target_class, pending_ops.target_package, pending_ops.user_id (code 2067 SQLITE_CONSTRAINT_UNIQUE)
at android.database.sqlite.SQLiteConnection.nativeExecuteForLastInsertedRowId(Native Method)
at android.database.sqlite.SQLiteConnection.executeForLastInsertedRowId(SQLiteConnection.java:879)
at android.database.sqlite.SQLiteSession.executeForLastInsertedRowId(SQLiteSession.java:790)
at android.database.sqlite.SQLiteStatement.executeInsert(SQLiteStatement.java:88)
at android.database.sqlite.SQLiteDatabase.insertWithOnConflict(SQLiteDatabase.java:1599)
at android.database.sqlite.SQLiteDatabase.insert(SQLiteDatabase.java:1468)
at aqne.a(:com.google.android.gms@202614037@20.26.14 (120400-320008519):175)
at aqme.a(:com.google.android.gms@202614037@20.26.14 (120400-320008519):180)
at aqme.a(:com.google.android.gms@202614037@20.26.14 (120400-320008519):22)
at aqme.a(:com.google.android.gms@202614037@20.26.14 (120400-320008519):175)
at aqio.run(:com.google.android.gms@202614037@20.26.14 (120400-320008519):9)
at sil.b(:com.google.android.gms@202614037@20.26.14 (120400-320008519):12)
at sil.run(:com.google.android.gms@202614037@20.26.14 (120400-320008519):7)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1167)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:641)
at sog.run(:com.google.android.gms@202614037@20.26.14 (120400-320008519):0)
at java.lang.Thread.run(Thread.java:919)
Просто для некоторого дополнительного контекста, если необходимо. Вот как выглядит мой CastOptionProvider.
public class CastOptionProvider implements OptionsProvider {
@Override
public CastOptions getCastOptions(Context context) {
NotificationOptions notificationOptions = new NotificationOptions.Builder()
.setTargetActivityClassName(ExpandedControlActivity.class.getName())
.build();
CastMediaOptions mediaOptions = new CastMediaOptions.Builder()
.setNotificationOptions(notificationOptions)
.setExpandedControllerActivityClassName(ExpandedControlActivity.class.getName())
.build();
return new CastOptions.Builder()
.setReceiverApplicationId(CastMediaControlIntent.DEFAULT_MEDIA_RECEIVER_APPLICATION_ID)
.setCastMediaOptions(mediaOptions)
.build();
}
@Override
public List<SessionProvider> getAdditionalSessionProviders(Context context) {
return Collections.emptyList();
}
}
и так выглядит моя ExpandedControlActivity
public class ExpandedControlActivity extends ExpandedControllerActivity {
@Override
protected void onCreate(Bundle bundle) {
super.onCreate(bundle);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
super.onCreateOptionsMenu(menu);
getMenuInflater().inflate(R.menu.expanded_controller, menu);
CastButtonFactory.setUpMediaRouteButton(this, menu, R.id.media_route_menu_item);
return true;
}
}
Кто-нибудь может указать мне, если я чего-то упускаю?