Android Chromecast: ExpandedControlActivity дает исключение SQLiteDatabaseException - PullRequest
1 голос
/ 05 августа 2020

Чтобы дать суть сценария. Я использую 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;
    }

}

Кто-нибудь может указать мне, если я чего-то упускаю?

...