Ich frage mich, ob ich eine Möglichkeit bekomme, Video über die Videowiedergabe im Vollbildmodus laufen zu lassen.
Ich habe viel gesucht und viele Möglichkeiten ausprobiert, wie zum Beispiel:
Thema im Manifest anwenden:
Android:theme="@Android:style/Theme.NoTitleBar.Fullscreen"
dies erzwingt jedoch nicht, dass das Video im Vollbildmodus angezeigt wird.
Bewerben Sie sich in der Aktivität selbst:
requestWindowFeature(Window.FEATURE_NO_TITLE);
getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
WindowManager.LayoutParams.FLAG_FULLSCREEN);
erzwingt auch nicht, dass das Video im Vollbildmodus angezeigt wird.
Der einzige Weg, um das Video zum Vollbild zu zwingen, ist:
<VideoView Android:id="@+id/myvideoview"
Android:layout_width="fill_parent"
Android:layout_alignParentRight="true"
Android:layout_alignParentLeft="true"
Android:layout_alignParentTop="true"
Android:layout_alignParentBottom="true"
Android:layout_height="fill_parent">
</VideoView>
Auf diese Weise wird ein Vollbildvideo erstellt, das jedoch das Video selbst streckt (längliches Video),
Ich wende diese ungeeignete Lösung nicht auf meine Videoansicht an. Gibt es also eine Möglichkeit, dies zu tun, ohne das Video zu dehnen?
Videoklasse:
public class Video extends Activity {
private VideoView myvid;
@Override
public void onCreate(Bundle icicle) {
super.onCreate(icicle);
setContentView(R.layout.main);
myvid = (VideoView) findViewById(R.id.myvideoview);
myvid.setVideoURI(Uri.parse("Android.resource://" + getPackageName()
+"/"+R.raw.video_1));
myvid.setMediaController(new MediaController(this));
myvid.requestFocus();
myvid.start();
}
}
main.xml:
<LinearLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
Android:layout_width="fill_parent"
Android:layout_height="fill_parent"
Android:orientation="vertical" >
<VideoView
Android:id="@+id/myvideoview"
Android:layout_width="fill_parent"
Android:layout_height="fill_parent" />
</LinearLayout>
Auf diese Weise können Sie die Eigenschaften des Videos selbst festlegen.
Verwenden Sie eine Oberflächenansicht (gibt Ihnen mehr Kontrolle über die Ansicht) und setzen Sie sie auf fill_parent, um den gesamten Bildschirm abzugleichen
<LinearLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
Android:orientation="vertical"
Android:layout_width="match_parent"
Android:layout_height="fill_parent">
<SurfaceView
Android:id="@+id/surfaceViewFrame"
Android:layout_width="fill_parent"
Android:layout_height="fill_parent"
Android:layout_gravity="center" >
</SurfaceView>
</Linearlayout>
rufen Sie dann in Ihrem Java-Code die Oberflächenansicht auf und fügen Sie Ihren Media Player hinzu
surfaceViewFrame = (SurfaceView) findViewById(R.id.surfaceViewFrame);
player = new MediaPlayer();
player.setDisplay(holder);
stellen Sie auf Ihrem Mediaplayer einen onPreparedListener ein und berechnen Sie die gewünschte Größe des Videos manuell, um den Bildschirm im gewünschten Verhältnis auszufüllen und das Video nicht zu dehnen!
player.setOnPreparedListener(new OnPreparedListener() {
@Override
public void onPrepared(MediaPlayer mp) {
// Adjust the size of the video
// so it fits on the screen
int videoWidth = player.getVideoWidth();
int videoHeight = player.getVideoHeight();
float videoProportion = (float) videoWidth / (float) videoHeight;
int screenWidth = getWindowManager().getDefaultDisplay().getWidth();
int screenHeight = getWindowManager().getDefaultDisplay().getHeight();
float screenProportion = (float) screenWidth / (float) screenHeight;
Android.view.ViewGroup.LayoutParams lp = surfaceViewFrame.getLayoutParams();
if (videoProportion > screenProportion) {
lp.width = screenWidth;
lp.height = (int) ((float) screenWidth / videoProportion);
} else {
lp.width = (int) (videoProportion * (float) screenHeight);
lp.height = screenHeight;
}
surfaceViewFrame.setLayoutParams(lp);
if (!player.isPlaying()) {
player.start();
}
}
});
Ich habe dies von einem Tutorial für das Video-Streaming geändert, das ich vor einiger Zeit verfolgt habe. Ich kann es jetzt nicht finden, um darauf zu verweisen.
Ich hoffe es hilft!
EDIT
Ok, wenn Sie möchten, dass das Video den gesamten Bildschirm einnimmt und Sie es nicht strecken möchten, werden am Ende schwarze Streifen an den Seiten angezeigt. Im Code, den ich gepostet habe, finden wir heraus, was größer ist, das Video oder den Bildschirm des Telefons und passen ihn so an, wie wir können.
Dort hast du meine komplette Aktivität, ein Video von einem Link zu streamen. Es ist zu 100% funktionsfähig. Ich kann Ihnen nicht sagen, wie Sie ein Video von Ihrem eigenen Gerät abspielen, da ich das nicht weiß. Ich bin sicher, Sie finden es in der Dokumentation hier oder hier .
public class VideoPlayer extends Activity implements Callback, OnPreparedListener, OnCompletionListener,
OnClickListener {
private SurfaceView surfaceViewFrame;
private static final String TAG = "VideoPlayer";
private SurfaceHolder holder;
private ProgressBar progressBarWait;
private ImageView pause;
private MediaPlayer player;
private Timer updateTimer;
String video_uri = "http://daily3gp.com/vids/familyguy_has_own_orbit.3gp";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.videosample);
pause = (ImageView) findViewById(R.id.imageViewPauseIndicator);
pause.setVisibility(View.GONE);
if (player != null) {
if (!player.isPlaying()) {
pause.setVisibility(View.VISIBLE);
}
}
surfaceViewFrame = (SurfaceView) findViewById(R.id.surfaceViewFrame);
surfaceViewFrame.setOnClickListener(this);
surfaceViewFrame.setClickable(false);
progressBarWait = (ProgressBar) findViewById(R.id.progressBarWait);
holder = surfaceViewFrame.getHolder();
holder.addCallback(this);
holder.setType(SurfaceHolder.SURFACE_TYPE_Push_BUFFERS);
player = new MediaPlayer();
player.setOnPreparedListener(this);
player.setOnCompletionListener(this);
player.setScreenOnWhilePlaying(true);
player.setDisplay(holder);
}
private void playVideo() {
new Thread(new Runnable() {
public void run() {
try {
player.setDataSource(video_uri);
player.prepare();
} catch (Exception e) { // I can split the exceptions to get which error i need.
showToast("Error while playing video");
Log.i(TAG, "Error");
e.printStackTrace();
}
}
}).start();
}
private void showToast(final String string) {
runOnUiThread(new Runnable() {
public void run() {
Toast.makeText(VideoPlayer.this, string, Toast.LENGTH_LONG).show();
finish();
}
});
}
public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
// TODO Auto-generated method stub
}
public void surfaceCreated(SurfaceHolder holder) {
playVideo();
}
public void surfaceDestroyed(SurfaceHolder holder) {
// TODO Auto-generated method stub
}
//prepare the video
public void onPrepared(MediaPlayer mp) {
progressBarWait.setVisibility(View.GONE);
// Adjust the size of the video
// so it fits on the screen
int videoWidth = player.getVideoWidth();
int videoHeight = player.getVideoHeight();
float videoProportion = (float) videoWidth / (float) videoHeight;
int screenWidth = getWindowManager().getDefaultDisplay().getWidth();
int screenHeight = getWindowManager().getDefaultDisplay().getHeight();
float screenProportion = (float) screenWidth / (float) screenHeight;
Android.view.ViewGroup.LayoutParams lp = surfaceViewFrame.getLayoutParams();
if (videoProportion > screenProportion) {
lp.width = screenWidth;
lp.height = (int) ((float) screenWidth / videoProportion);
} else {
lp.width = (int) (videoProportion * (float) screenHeight);
lp.height = screenHeight;
}
surfaceViewFrame.setLayoutParams(lp);
if (!player.isPlaying()) {
player.start();
}
surfaceViewFrame.setClickable(true);
}
// callback when the video is over
public void onCompletion(MediaPlayer mp) {
mp.stop();
if (updateTimer != null) {
updateTimer.cancel();
}
finish();
}
//pause and resume
public void onClick(View v) {
if (v.getId() == R.id.surfaceViewFrame) {
if (player != null) {
if (player.isPlaying()) {
player.pause();
pause.setVisibility(View.VISIBLE);
} else {
player.start();
pause.setVisibility(View.GONE);
}
}
}
}
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
videoView1 = (VideoView) findViewById(R.id.videoview);
String SrcPath = "/mnt/sdcard/final.mp4";
videoView1.setVideoPath(SrcPath);
videoView1.setMediaController(new MediaController(this));
videoView1.requestFocus();
videoView1.start();
}
}
<VideoView
Android:id="@+id/videoview"
Android:layout_width="fill_parent"
Android:layout_height="fill_parent"
Android:layout_alignParentBottom="true"
Android:layout_alignParentLeft="true"
Android:layout_alignParentRight="true"
Android:layout_alignParentTop="true" >
</VideoView>
versuchen Sie dies, es funktioniert für mich
Die aktuell aktualisierte Lösung funktioniert, aber es gibt möglicherweise eine einfachere Lösung für das ursprüngliche Problem. Ein Kommentator hat zu Recht darauf hingewiesen, dass Sie die Größe eines VideoView-Objekts mit derselben Methode ändern können, ohne dass dafür Kosten in ein SurfaceView-Gerät umgewandelt werden müssten. Ich habe dies in einer meiner Apps getestet und es scheint zu funktionieren. Fügen Sie einfach die berechneten Layout-Parameter zum VideoView im OnPreparedListener-Callback hinzu:
mInspirationalVideoView.setOnPreparedListener (neuer MediaPlayer.OnPreparedListener () { @Override public void onPrepared (MediaPlayer mp) { // mMediaPlayer = mp;
mp.setOnSeekCompleteListener(new MediaPlayer.OnSeekCompleteListener() {
@Override
public void onSeekComplete(MediaPlayer mp) {
if(isPlaying = true) {
stopPosition = 0;
mp.start();
mVideoProgressTask = new VideoProgress();
mVideoProgressTask.execute();
}
}
});
// so it fits on the screen
int videoWidth = mp.getVideoWidth();
int videoHeight = mp.getVideoHeight();
float videoProportion = (float) videoWidth / (float) videoHeight;
int screenWidth = getWindowManager().getDefaultDisplay().getWidth();
int screenHeight = getWindowManager().getDefaultDisplay().getHeight();
float screenProportion = (float) screenWidth / (float) screenHeight;
Android.view.ViewGroup.LayoutParams lp = mInspirationalVideoView.getLayoutParams();
if (videoProportion > screenProportion) {
lp.width = screenWidth;
lp.height = (int) ((float) screenWidth / videoProportion);
} else {
lp.width = (int) (videoProportion * (float) screenHeight);
lp.height = screenHeight;
}
mInspirationalVideoView.setLayoutParams(lp);
...
}
});
Nun, ich hoffe es hilft FullscreenVideoView
Es behandelt den gesamten langweiligen Code für die Oberflächenansicht und die Vollbildansicht und lässt Sie nur auf die Schaltflächen der Benutzeroberfläche fokussieren.
Sie können das FullscreenVideoLayout verwenden, wenn Sie keine benutzerdefinierten Schaltflächen erstellen möchten.
Ein SurfaceView gibt Ihnen eine optimierte Zeichenoberfläche
public class YourMovieActivity extends Activity implements SurfaceHolder.Callback {
private MediaPlayer media = null;
//...
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
media = new MediaPlayer();
mSurfaceView = (SurfaceView) findViewById(R.id.surface);
//...
}
}
MediaPlayer-Aufrufe sollten in einen try {} eingeschlossen werden.
@Override
public void surfaceCreated(SurfaceHolder holder) {
media.setDataSource("Android.resource://" + getPackageName()
+"/"+R.raw.video_);
media.prepare();
int videoWidth = mp.getVideoWidth();
int videoHeight = mp.getVideoHeight();
int screenWidth = getWindowManager().getDefaultDisplay().getWidth();
Android.view.
ViewGroup.LayoutParams layout = mSurfaceView.getLayoutParams();
layout.width = screenWidth;
layout.height = (int) (((float)videoHeight / (float)videoWidth) * (float)screenWidth);
mSurfaceView.setLayoutParams(layout);
mp.start();
}
Hier ist meine Funktion, die für das Vollbildvideo funktioniert, ohne es zu dehnen. Die Seiten des Videos werden automatisch zugeschnitten. Es funktionierte sowohl im Hoch- als auch im Querformat.
Es wurde tatsächlich aus der Antwort genommen.
public void onPrepared(MediaPlayer mp) {
int videoWidth = mediaPlayer.getVideoWidth();
int videoHeight = mediaPlayer.getVideoHeight();
DisplayMetrics displayMetrics = new DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(displayMetrics);
int screenWidth = displayMetrics.widthPixels;
int screenHeight = displayMetrics.heightPixels;
float scaleY = 1.0f;
float scaleX = (videoWidth * screenHeight / videoHeight) / screenWidth;
int pivotPointX = (int) (screenWidth / 2);
int pivotPointY = (int) (screenHeight / 2);
surfaceView.setScaleX(scaleX);
surfaceView.setScaleY(scaleY);
surfaceView.setPivotX(pivotPointX);
surfaceView.setPivotY(pivotPointY);
mediaPlayer.setLooping(true);
mediaPlayer.start();
}
Haben Sie versucht, die Größe des darunterliegenden Flächenhalters anzupassen? Versuchen Sie es mit dem Code darunter. Der Oberflächenhalter muss auf die gleiche Breite und Höhe der Bildschirmgröße eingestellt werden. Sie sollten Ihre Aktivität auch ohne Titelleiste als Vollbild anzeigen.
public class Video extends Activity {
private VideoView myvid;
@Override
public void onCreate(Bundle icicle) {
super.onCreate(icicle);
setContentView(R.layout.main);
myvid = (VideoView) findViewById(R.id.myvideoview);
myvid.setVideoURI(Uri.parse("Android.resource://" + getPackageName()
+"/"+R.raw.video_1));
myvid.setMediaController(new MediaController(this));
myvid.requestFocus();
//Set the surface holder height to the screen dimensions
Display display = getWindowManager().getDefaultDisplay();
Point size = new Point();
display.getSize(size);
myvid.getHolder().setFixedSize(size.x, size.y);
myvid.start();
}
}
Ich habe dieses Problem gelöst durch Custom VideoView :
Ich habe VideoView auf zwei Arten zu ParentView hinzugefügt.
Fügen Sie die benutzerdefinierte Klasse für VideoView mit dem Namen FullScreenVideoView.Java hinzu:
import Android.content.Context;
import Android.util.AttributeSet;
import Android.widget.VideoView;
public class FullScreenVideoView extends VideoView {
public FullScreenVideoView(Context context) {
super(context);
}
public FullScreenVideoView(Context context, AttributeSet attrs) {
super(context, attrs);
}
public FullScreenVideoView(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
}
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec){
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
setMeasuredDimension(widthMeasureSpec, heightMeasureSpec);
}
}
Wie binden mit xml :
<FrameLayout
Android:id="@+id/secondMedia"
Android:layout_width="match_parent"
Android:layout_height="match_parent">
<com.my.package.customview.FullScreenVideoView
Android:layout_width="match_parent"
Android:layout_height="match_parent"
Android:id="@+id/fullScreenVideoView"/>
</FrameLayout>
ODER
/ Programmatisch hinzufügen VideoView zu ParentView :
FullScreenVideoView videoView = new FullScreenVideoView(getActivity());
parentLayout.addView(videoView, new FrameLayout.LayoutParams(FrameLayout.LayoutParams.MATCH_PARENT, FrameLayout.LayoutParams.MATCH_PARENT));
Hoffe, das wird dir helfen.