I have an Android application that plays video links, and I’d like to add the ability to play DRM-protected links using ClearKey. In the code, all the necessary information is available: the video link is stored in video_url, and the key and keyId for DRM are stored in drmkey in the format 5454545454:545454545. To enable DRM playback, the code should check if drmkey is not empty, which means the video is DRM-protected. I only want to play videos using ClearKey, so ClearKey should be set as the default. Your assistance would be greatly appreciated!
Code:package com.dandanaarplus.activities; import android.annotation.SuppressLint; import android.content.Intent; import android.content.pm.ActivityInfo; import android.net.Uri; import android.os.Build; import android.os.Bundle; import android.support.v4.media.session.PlaybackStateCompat; import android.text.TextUtils; import android.view.View; import android.view.ViewGroup; import android.view.WindowManager; import android.widget.ImageView; import android.widget.ProgressBar; import android.widget.RelativeLayout; import androidx.annotation.NonNull; import androidx.annotation.Nullable; import androidx.appcompat.app.AlertDialog; import androidx.appcompat.app.AppCompatActivity; import androidx.core.content.ContextCompat; import com.dandanaarplus.Config; import com.dandanaarplus.R; import com.dandanaarplus.databases.prefs.SharedPref; import com.google.android.exoplayer2.C; import com.google.android.exoplayer2.DefaultLoadControl; import com.google.android.exoplayer2.ExoPlayer; import com.google.android.exoplayer2.LoadControl; import com.google.android.exoplayer2.MediaItem; import com.google.android.exoplayer2.PlaybackException; import com.google.android.exoplayer2.Player; import com.google.android.exoplayer2.Timeline; import com.google.android.exoplayer2.extractor.DefaultExtractorsFactory; import com.google.android.exoplayer2.source.MediaSource; import com.google.android.exoplayer2.source.ProgressiveMediaSource; import com.google.android.exoplayer2.source.dash.DashMediaSource; import com.google.android.exoplayer2.source.hls.HlsMediaSource; import com.google.android.exoplayer2.source.rtsp.RtspMediaSource; import com.google.android.exoplayer2.text.Cue; import com.google.android.exoplayer2.trackselection.AdaptiveTrackSelection; import com.google.android.exoplayer2.trackselection.DefaultTrackSelector; import com.google.android.exoplayer2.ui.StyledPlayerView; import com.google.android.exoplayer2.upstream.DefaultDataSource; import com.google.android.exoplayer2.upstream.DefaultHttpDataSource; import com.google.android.exoplayer2.upstream.HttpDataSource; import com.google.android.exoplayer2.util.Log; import com.google.android.exoplayer2.util.Util; import com.google.android.material.snackbar.Snackbar; import com.dandanaarplus.utils.Constant; import java.util.Collections; import java.util.List; public class ActivityStreamPlayer extends AppCompatActivity { private static final String TAG = "ActivityStreamPlayer"; String video_url; String user_agent; String referer; String drmkey; private StyledPlayerView styledPlayerView; private ExoPlayer exoPlayer; private DefaultDataSource.Factory dataSourceFactory; private ProgressBar progressBar; boolean fullscreen = false; private ImageView fullscreenButton; private long exitTime = 0; RelativeLayout parent_view; SharedPref sharedPref; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); this.getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN); setContentView(R.layout.activity_streaming); if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { this.getWindow().setNavigationBarColor(ContextCompat.getColor(getApplicationContext(), R.color.colorBlack)); this.getWindow().setStatusBarColor(ContextCompat.getColor(getApplicationContext(), R.color.colorBlack)); this.getWindow().getDecorView().setSystemUiVisibility(0); } Intent intent = getIntent(); video_url = intent.getStringExtra("url"); user_agent = intent.getStringExtra("user_agent"); referer = intent.getStringExtra("referer"); drmkey = intent.getStringExtra("drmkey"); sharedPref = new SharedPref(this); parent_view = findViewById(R.id.parent_view); progressBar = findViewById(R.id.progressBar); if (user_agent.equals("default")) { HttpDataSource.Factory httpDataSourceFactory = new DefaultHttpDataSource.Factory() .setAllowCrossProtocolRedirects(true) .setUserAgent(getUserAgent()); if (referer != null && !referer.isEmpty()) { httpDataSourceFactory.setDefaultRequestProperties(Collections.singletonMap("Referer", referer)); } dataSourceFactory = new DefaultDataSource.Factory(getApplicationContext(), httpDataSourceFactory); Log.d(TAG, "user agent : " + getUserAgent()); } else { HttpDataSource.Factory httpDataSourceFactory = new DefaultHttpDataSource.Factory() .setAllowCrossProtocolRedirects(true) .setUserAgent(user_agent); if (referer != null && !referer.isEmpty()) { httpDataSourceFactory.setDefaultRequestProperties(Collections.singletonMap("Referer", referer)); } dataSourceFactory = new DefaultDataSource.Factory(getApplicationContext(), httpDataSourceFactory); Log.d(TAG, "user agent : " + user_agent); } LoadControl loadControl = new DefaultLoadControl(); AdaptiveTrackSelection.Factory trackSelectionFactory = new AdaptiveTrackSelection.Factory(); DefaultTrackSelector trackSelector = new DefaultTrackSelector(this, trackSelectionFactory); exoPlayer = new ExoPlayer.Builder(this) .setTrackSelector(trackSelector) .setLoadControl(loadControl) .build(); styledPlayerView = findViewById(R.id.exoPlayerView); styledPlayerView.setPlayer(exoPlayer); styledPlayerView.setUseController(true); styledPlayerView.requestFocus(); playerOrientation(); Uri uri = Uri.parse(video_url); MediaSource mediaSource = buildMediaSource(uri); exoPlayer.setMediaSource(mediaSource); exoPlayer.prepare(); exoPlayer.setPlayWhenReady(true); exoPlayer.addListener(new Player.Listener() { @Override public void onCues(@NonNull List<Cue> cues) { } @Override public void onTimelineChanged(@NonNull Timeline timeline, int reason) { } @Override public void onPlaybackStateChanged(int state) { if (state == PlaybackStateCompat.STATE_PLAYING) { progressBar.setVisibility(View.GONE); } if (Config.ENABLE_LOOPING_MODE) { switch (state) { case Player.STATE_READY: progressBar.setVisibility(View.GONE); exoPlayer.setPlayWhenReady(true); break; case Player.STATE_ENDED: exoPlayer.seekTo(0); break; case Player.STATE_BUFFERING: progressBar.setVisibility(View.VISIBLE); exoPlayer.seekTo(0); break; case Player.STATE_IDLE: break; } } } @Override public void onPlayWhenReadyChanged(boolean playWhenReady, int reason) { } @Override public void onIsPlayingChanged(boolean isPlaying) { } @Override public void onRepeatModeChanged(int repeatMode) { } @Override public void onShuffleModeEnabledChanged(boolean shuffleModeEnabled) { } @Override public void onPlayerError(@NonNull PlaybackException error) { exoPlayer.stop(); errorDialog(); Log.d(TAG, "onPlayerError " + error); } @Override public void onPlayerErrorChanged(@Nullable PlaybackException error) { Log.d(TAG, "onPlayerErrorChanged " + error); } }); } private void playerOrientation() { fullscreenButton = styledPlayerView.findViewById(R.id.exo_fullscreen_icon); fullscreenButton.setOnClickListener(view -> { if (fullscreen) { setPortrait(); } else { setLandscape(); } }); if (sharedPref.getPlayerMode() == Constant.PLAYER_MODE_LANDSCAPE) { setLandscape(); } } @SuppressLint("SourceLockedOrientationActivity") private void setPortrait() { fullscreenButton.setImageDrawable(ContextCompat.getDrawable(ActivityStreamPlayer.this, R.drawable.ic_fullscreen_open)); getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_VISIBLE); if (getSupportActionBar() != null) { getSupportActionBar().show(); } setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT); RelativeLayout.LayoutParams params = (RelativeLayout.LayoutParams) styledPlayerView.getLayoutParams(); params.width = ViewGroup.LayoutParams.MATCH_PARENT; params.height = ViewGroup.LayoutParams.MATCH_PARENT; styledPlayerView.setLayoutParams(params); fullscreen = false; } private void setLandscape() { fullscreenButton.setImageDrawable(ContextCompat.getDrawable(ActivityStreamPlayer.this, R.drawable.ic_fullscreen_close)); getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_FULLSCREEN | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION); if (getSupportActionBar() != null) { getSupportActionBar().hide(); } setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE); RelativeLayout.LayoutParams params = (RelativeLayout.LayoutParams) styledPlayerView.getLayoutParams(); params.width = ViewGroup.LayoutParams.MATCH_PARENT; params.height = ViewGroup.LayoutParams.MATCH_PARENT; styledPlayerView.setLayoutParams(params); fullscreen = true; } @SuppressLint("SwitchIntDef") private MediaSource buildMediaSource(Uri uri) { MediaItem mMediaItem = MediaItem.fromUri(Uri.parse(String.valueOf(uri))); int type = TextUtils.isEmpty(null) ? Util.inferContentType(uri) : Util.inferContentType("." + null); switch (type) { case C.TYPE_DASH: return new DashMediaSource.Factory(dataSourceFactory) .createMediaSource(mMediaItem); case C.TYPE_HLS: return new HlsMediaSource.Factory(dataSourceFactory) .setAllowChunklessPreparation(true) .createMediaSource(mMediaItem); case C.TYPE_OTHER: return new ProgressiveMediaSource.Factory(dataSourceFactory, new DefaultExtractorsFactory()) .createMediaSource(mMediaItem); case C.TYPE_RTSP: return new RtspMediaSource.Factory() .createMediaSource(MediaItem.fromUri(uri)); default: { throw new IllegalStateException("Unsupported type: " + type); } } } private String getUserAgent() { StringBuilder result = new StringBuilder(64); result.append("Dalvik/"); result.append(System.getProperty("java.vm.version")); result.append(" (Linux; U; Android "); String version = Build.VERSION.RELEASE; result.append(version.length() > 0 ? version : "1.0"); if ("REL".equals(Build.VERSION.CODENAME)) { String model = Build.MODEL; if (model.length() > 0) { result.append("; "); result.append(model); } } String id = Build.ID; if (id.length() > 0) { result.append(" Build/"); result.append(id); } result.append(")"); return result.toString(); } @Override public void onBackPressed() { closePlayer(); } @Override protected void onPause() { super.onPause(); exoPlayer.setPlayWhenReady(false); exoPlayer.getPlaybackState(); } @Override protected void onResume() { super.onResume(); exoPlayer.setPlayWhenReady(true); exoPlayer.getPlaybackState(); } public void closePlayer() { if (Config.PRESS_BACK_TWICE_TO_CLOSE_PLAYER) { if ((System.currentTimeMillis() - exitTime) > 2000) { Snackbar.make(parent_view, getString(R.string.press_again_to_close_player), Snackbar.LENGTH_SHORT).show(); exitTime = System.currentTimeMillis(); } else { finish(); exoPlayer.stop(); } } else { finish(); exoPlayer.stop(); } } public void errorDialog() { new AlertDialog.Builder(this) .setTitle(getString(R.string.whops)) .setCancelable(false) .setMessage(getString(R.string.msg_failed)) .setPositiveButton(getString(R.string.option_retry), (dialog, which) -> retryLoad()) .setNegativeButton(getString(R.string.option_no), (dialogInterface, i) -> finish()) .show(); } public void retryLoad() { Uri uri = Uri.parse(video_url); MediaSource mediaSource = buildMediaSource(uri); exoPlayer.setMediaSource(mediaSource); exoPlayer.prepare(); exoPlayer.setPlayWhenReady(true); } }
Try StreamFab Downloader and download from Netflix, Amazon, Youtube! Or Try DVDFab and copy Blu-rays!
+ Reply to Thread
Results 1 to 1 of 1
Thread
Similar Threads
-
Modifying PotPlayer behavior
By lordlance in forum Software PlayingReplies: 0Last Post: 16th Jan 2023, 12:14 -
modifying yt-dlp
By rrats in forum Video Streaming DownloadingReplies: 10Last Post: 28th Jul 2022, 14:06 -
Modifying .mpd query parameters
By joasis in forum Video Streaming DownloadingReplies: 0Last Post: 28th May 2022, 12:50 -
I need help in changing and modifying font in Handbrake
By Lsh72 in forum Video ConversionReplies: 2Last Post: 22nd Sep 2021, 07:13 -
help modifying this extension
By filipino in forum Video Streaming DownloadingReplies: 0Last Post: 21st Sep 2021, 17:24