• After 15+ years, we've made a big change: Android Forums is now Early Bird Club. Learn more here.

Apps iphone video recorded video not playing android 7.0 nougat


Issue in activity class which play video from url which comes from server, this url of video also contains the MOV video format which recorded by IOS, this activity playing video fine in lower than android nougat 7.0 version and now this class unable to play MOV video format in android nougat 7.0.

package com.test.test;

import android.app.ProgressDialog;
import android.content.Context;
import android.content.Intent;
import android.content.res.AssetFileDescriptor;
import android.content.res.Configuration;
import android.media.AudioManager;
import android.media.MediaPlayer;
import android.media.TimedMetaData;
import android.media.TimedText;
import android.net.Uri;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.os.Parcel;
import android.support.v7.app.AppCompatActivity;
import android.util.DisplayMetrics;
import android.util.Log;
import android.view.MotionEvent;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
import android.view.View;
import android.view.WindowManager;
import android.widget.MediaController;
import android.widget.ProgressBar;
import android.widget.SeekBar;

import com.townhalltogo_fs.R;
import com.townhalltogo_fs.constant.AppConstant;
import com.townhalltogo_fs.retrofit.model.request.VideoQuestionsModel;
import com.townhalltogo_fs.retrofit.model.response.VideoQuestionsResponseModel;
import com.townhalltogo_fs.retrofit.network.ApiClient;
import com.townhalltogo_fs.retrofit.network.ApiInterface;
import com.townhalltogo_fs.utils.Logger;
import com.townhalltogo_fs.utils.UtilCustomDialog;
import com.townhalltogo_fs.utils.Utility;

import java.io.IOException;

import retrofit2.Call;
import retrofit2.Callback;
import retrofit2.Response;


public class VideoPlayActivity extends AppCompatActivity implements SurfaceHolder.Callback,
MediaPlayer.OnPreparedListener, MediaPlayer.OnCompletionListener, MediaPlayer.OnErrorListener,
MediaController.MediaPlayerControl{

private static final String TAG = VideoPlayActivity.class.getName();
private Context mContext;
private int mVideoPlayingPosition = 0;
private Uri mVideoUri;
private int mVideoId;
private boolean mIsFeedbackSubmitted;
private ProgressBar mProgressBar;
private ProgressDialog mProgressDialog;
private SeekBar mVolumeSeekbar;
private AudioManager mAudioManager;

private SurfaceView mVideoSurface;
private MediaPlayer mMediaPlayer;
//private VideoControllerView mController;
private SurfaceHolder mSurfaceHolder;
private MediaController mMediaController;
private Handler mHandler;
String url;


@override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_video_play);

mContext = VideoPlayActivity.this;

//initial method call
init();
}

/**
* user: Chetu
* date: 12/26/2016
* description: All own methods are getting called from this method.
* return: void
*/
private void init(){

getViewId();
getIntentData();
setView();
setListener();
}

private void getViewId() {
mVideoSurface = (SurfaceView) findViewById(R.id.videoSurface);
mProgressBar = (ProgressBar)findViewById(R.id.progress_bar);
mVolumeSeekbar = (SeekBar)findViewById(R.id.volume_seekbar);
}


private void getIntentData(){
Bundle bundle = getIntent().getExtras();
// mVideoUri = Uri.parse(bundle.getString(AppConstant.VIDEO_URI));
if (bundle != null) {
url = bundle.getString(AppConstant.VIDEO_URI);

//Code to remove the space with %20
url = (url != null) ? (url.replace(" ", "%20")) : "";
mVideoUri = Uri.parse(url);
mVideoId = bundle.getInt(AppConstant.VIDEO_ID);
mIsFeedbackSubmitted = bundle.getBoolean(AppConstant.IS_FEEDBACK_SUBMITTED);
}
}


private void setView() {
//Show the progress bar
mProgressBar.setVisibility(View.VISIBLE);

mSurfaceHolder = mVideoSurface.getHolder();
mSurfaceHolder.addCallback(this);

mHandler = new Handler();
}


private void setListener() {

try {
mMediaController = new MediaController(this);

/*mMediaPlayer = MediaPlayer.create(this, mVideoUri);
mMediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
mMediaPlayer.prepareAsync();*/

} catch (Exception e) {
e.printStackTrace();
}
}

@override
protected void onResume() {
try {
setView();
mMediaController = new MediaController(this);
} catch (Exception e) {
e.printStackTrace();
}
super.onResume();
}

@override
protected void onPause() {
// Hide the MediaController and release the MediaPlayer
mMediaController.hide();

if (mMediaPlayer != null) {
mMediaPlayer.release();
mMediaPlayer = null;
}

super.onPause();

Log.d("====>>", "onPause");
}

@override
protected void onDestroy() {
super.onDestroy();

if (mMediaPlayer != null) {
mMediaPlayer.release();
mMediaPlayer = null;
}

Log.d("====>>", "onDestroy");
}

//All override methods
@override
public boolean onTouchEvent(MotionEvent event) {
mMediaController.show();
return false;
}

@override
public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
Log.d("=======", "surfaceChanged");
}

@override
public void surfaceCreated(SurfaceHolder holder) {
Log.e("=======", "surfaceCreated");
mMediaPlayer = new MediaPlayer();
mMediaPlayer.setDisplay(mSurfaceHolder);
try {

Log.e(">>>",">>>> URL >>>> "+url);

// AssetFileDescriptor afd = getAssets().openFd("test_play.MOV");

// mMediaPlayer.setDataSource(afd.getFileDescriptor(),afd.getStartOffset(), afd.getLength());
mMediaPlayer.setDataSource(url);
// mMediaPlayer.setDataSource(mContext, mVideoUri);
//mMediaPlayer.prepare();
mMediaPlayer.prepareAsync();
//Register listeners
mMediaPlayer.setOnPreparedListener(this);
mMediaPlayer.setOnCompletionListener(this);
mMediaPlayer.setOnErrorListener(this);
mMediaPlayer.setScreenOnWhilePlaying(true);
mMediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);

mMediaPlayer.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
@override
public void onPrepared(MediaPlayer mp) {
Log.e(">>>>",">>>> prepared listener called.");
Log.e(">>>>",">>>> "+mp.getDuration());

}
});
} catch (IOException e) {
e.printStackTrace();
}
}

@override
public void surfaceDestroyed(SurfaceHolder holder) {
Log.d("=======", "surfaceDestroyed");

}

// Implement MediaPlayer.OnPreparedListener
@override
public void onPrepared(MediaPlayer mediaPlayer) {
Log.d("=======", "onPrepared");

setVideoSize(mediaPlayer);

//Close the progress bar
if(mProgressBar != null)
mProgressBar.setVisibility(View.GONE);

try{
//Set the media controls
mMediaController.setMediaPlayer(this);
mMediaController.setAnchorView(findViewById(R.id.videoSurface));
mMediaController.setEnabled(true);

mediaPlayer.start();

} catch (Exception e){
e.printStackTrace();
}

//Method call to show the volume control
setVolumeControl();

/*** Code for buffering ***/
mediaPlayer.setOnInfoListener(new MediaPlayer.OnInfoListener() {
@override
public boolean onInfo(MediaPlayer mediaPlayer, int what, int extra) {
switch (what){
case MediaPlayer.MEDIA_INFO_BUFFERING_START :
mProgressBar.setVisibility(View.VISIBLE);
break;

case MediaPlayer.MEDIA_INFO_BUFFERING_END :
mProgressBar.setVisibility(View.GONE);
break;

default : break;
}
return true;
}

});
}

@override
public void onCompletion(MediaPlayer mediaPlayer) {
Log.d("=======", "onCompletion");
//Check video feedback is submitted
if(!mIsFeedbackSubmitted){
mMediaPlayer.stop();
//Method call to get questions for feedback screen of particular video

getFeedbackQuestions(findViewById(android.R.id.content), mVideoId + "");

} else {
VideoPlayActivity.this.finish();

}
}
@override
public void onConfigurationChanged(Configuration newConfig) {
super.onConfigurationChanged(newConfig);
}

@override
public void start() {
Log.d("=======", "start");
mMediaPlayer.start();
}

@override
public void pause() {
Log.d("=======", "pause");
mMediaPlayer.pause();
mProgressBar.setVisibility(View.GONE);
}

@override
public int getDuration() {
Log.d("=======", "getDuration");
return mMediaPlayer.getDuration();
}

@override
public int getCurrentPosition() {
Log.d("=======", "getCurrentPosition");
if(mMediaPlayer != null)
return mMediaPlayer.getCurrentPosition();
else return 0;
}

@override
public void seekTo(int i) {
Log.d("=======", "seekTo");
mMediaPlayer.seekTo(i);
}

@override
public boolean isPlaying() {
Log.d("=======", "isPlaying");
return mMediaPlayer.isPlaying();
}

@override
public int getBufferPercentage() {
Log.d("=======", "getBufferPercentage");
return 0;
}

@override
public boolean canPause() {
Log.d("=======", "canPause");
return true;
}

@override
public boolean canSeekBackward() {
Log.d("=======", "canSeekBackward");
return true;
}

@override
public boolean canSeekForward() {
Log.d("=======", "canSeekForward");
return true;
}

@override
public int getAudioSessionId() {
Log.d("=======", "getAudioSessionId");
return 0;
}

// @override
// public void onSaveInstanceState(Bundle savedInstanceState) {
// super.onSaveInstanceState(savedInstanceState);
// //we use onSaveInstanceState in order to store the video playback position for orientation change
// savedInstanceState.putInt("Position", mMediaPlayer.getCurrentPosition());
// mMediaPlayer.pause();
// Log.d("=======", "onSaveInstanceState");
// }
//
// @override
// protected void onRestoreInstanceState(Bundle savedInstanceState) {
// super.onRestoreInstanceState(savedInstanceState);
// //we use onRestoreInstanceState in order to play the video playback from the stored position
// mVideoPlayingPosition = savedInstanceState.getInt("Position");
// mMediaPlayer.seekTo(mVideoPlayingPosition);
// Log.d("=======", "onRestoreInstanceState");
// }

/**
* user: Chetu
* date: 12/23/2016
* description: Method to get the questions from server for feedback screen.
* return: void
*/
private void getFeedbackQuestions (final View view, String videoId) {
//Check is internet connected
if (!Utility.isInternetConnected(mContext)) {
UtilCustomDialog.showCustomDialog(mContext, getString(R.string.check_internet_connection));
} else {
try {
mProgressDialog = new ProgressDialog(mContext);
mProgressDialog.setMessage(getString(R.string.please_wait));
mProgressDialog.show();

VideoQuestionsModel videoQuestionsModel = new VideoQuestionsModel();
videoQuestionsModel.setVideoId(videoId);
ApiInterface apiService = ApiClient.getClient().create(ApiInterface.class);
Call<VideoQuestionsResponseModel> call = apiService.videoQuestionRequest(videoQuestionsModel);

call.enqueue(new Callback<VideoQuestionsResponseModel>() {
@override
public void onResponse(Call<VideoQuestionsResponseModel> call, Response<VideoQuestionsResponseModel> response) {

if (response.isSuccessful()) {
if (response.body().getResponseCode() == 1) {

//Close progress dialog
mProgressDialog.dismiss();

Intent intent = new Intent(VideoPlayActivity.this, FeedbackActivity.class);
intent.putExtra(AppConstant.QUESTIONS, response.body());
startActivity(intent);
finish();
} else {
//Show snack bar
UtilCustomDialog.showCustomDialog(mContext, response.body().getResponseMessage());
//Close progress dialog
mProgressDialog.dismiss();
}

} else {
UtilCustomDialog.showCustomDialog(mContext, getString(R.string.internal_server_error));
//Close progress dialog
mProgressDialog.dismiss();
}
}

@override
public void onFailure(Call<VideoQuestionsResponseModel> call, Throwable t) {

UtilCustomDialog.showCustomDialog(mContext, getString(R.string.check_internet_connection));

mProgressDialog.dismiss();
}
});
} catch (Exception e) {
e.printStackTrace();
//To generate log file in case of exception.
Logger.generateLog(TAG, e.getMessage());
mProgressDialog.dismiss();
}
}
}

/**
* user: Chetu
* date: 12/29/2016
* description: Method to show the volume control seekbar.
* return: void
*/
private void setVolumeControl(){

if(mVolumeSeekbar != null){
//Show the volume seek bar
mVolumeSeekbar.setVisibility(View.VISIBLE);

mAudioManager = (AudioManager) mContext.getSystemService(Context.AUDIO_SERVICE);
mVolumeSeekbar.setMax(mAudioManager.getStreamMaxVolume(AudioManager.STREAM_MUSIC));
mVolumeSeekbar.setProgress(mAudioManager.getStreamVolume(AudioManager.STREAM_MUSIC));

mVolumeSeekbar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {

@override
public void onStopTrackingTouch(SeekBar seekBar) {}

@override
public void onStartTrackingTouch(SeekBar seekBar) {}

@override
public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
// TODO Auto-generated method stub
mAudioManager.setStreamVolume(AudioManager.STREAM_MUSIC, progress, 0);

}
});
}
}

/**
* user: Chetu
* date: 1/27/2017
* description: Method to set the video size according to screen size.
* return: void
*/
private void setVideoSize(MediaPlayer mediaPlayer) {

// Get the dimensions of the video
int videoWidth = mediaPlayer.getVideoWidth();
int videoHeight = mediaPlayer.getVideoHeight();
float videoProportion = (float) videoWidth / (float) videoHeight;

// Get the width of the screen
DisplayMetrics displayMetrics = new DisplayMetrics();
WindowManager windowmanager = (WindowManager) getApplicationContext().getSystemService(Context.WINDOW_SERVICE);
windowmanager.getDefaultDisplay().getMetrics(displayMetrics);
int screenWidth = displayMetrics.widthPixels;
int screenHeight = displayMetrics.heightPixels;
float screenProportion = (float) screenWidth / (float) screenHeight;

// Get the SurfaceView layout parameters
android.view.ViewGroup.LayoutParams lp = mVideoSurface.getLayoutParams();
if (videoProportion > screenProportion) {
lp.width = screenWidth;
lp.height = (int) ((float) screenWidth / videoProportion);
} else {
lp.width = (int) (videoProportion * (float) screenHeight);
lp.height = screenHeight;
}
// Commit the layout parameters
mVideoSurface.setLayoutParams(lp);
}

@override
public boolean onError(MediaPlayer mediaPlayer, int errorCode, int i1) {
Log.d("======", "onError");
Log.d("======", "Error message --> "+errorCode+", and i1 --> "+i1);

return false;
}

@override
protected void onStop() {
super.onStop();
Log.d("====>>", "onStop");
}

@override
protected void onRestart() {
super.onRestart();
Log.d("====>>", "onRestart");
}
}

And layout xml of activity is :

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@color/black">

<SurfaceView
android:id="@+id/videoSurface"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_centerInParent="true"/>

<com.h6ah4i.android.widget.verticalseekbar.VerticalSeekBarWrapper
android:layout_width="wrap_content"
android:layout_height="@dimen/dp_150"
android:layout_alignParentRight="true"
android:layout_alignParentEnd="true"
android:layout_centerVertical="true"
android:layout_marginRight="@dimen/dp_20"
android:layout_marginEnd="@dimen/dp_20">

<com.h6ah4i.android.widget.verticalseekbar.VerticalSeekBar
android:id="@+id/volume_seekbar"
android:layout_width="0dp"
android:layout_height="0dp"
android:layout_marginTop="@dimen/dp_nav10"
app:seekBarRotation="CW270"
android:visibility="invisible"/>
</com.h6ah4i.android.widget.verticalseekbar.VerticalSeekBarWrapper>




<ProgressBar
android:id="@+id/progress_bar"
style="?android:attr/progressBarStyleLarge"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:visibility="visible"
android:layout_centerInParent="true"/>



</RelativeLayout>
 
Back
Top Bottom