gpt4 book ai didi

Android 视频播放但 VideoView 没有出现

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:04:26 26 4
gpt4 key购买 nike

我正在尝试在用户更改位置时在 Google map 上播放视频。最初在 activity_main.xml 中,视频 View 设置为不可见。当视频即将播放时,我将视频 View 设置为可见并设置 ZOrderOnTop(true)。

当视频被 onLocationChanged 触发时,videoview 不会出现。但我可以听到视频中的音频,所以我知道它在播放。

但是,如果我先在 onCreate 中播放视频,它会成功播放并出现在屏幕上。 onLocationChanged 视频也会播放并出现在屏幕上。

如果我不在 onCreate 中播放视频,为什么没有出现 videovideo View ?

activtity_main.xml

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:gravity="center" >

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent" >

<TextView android:id="@+id/top_message"
android:layout_width="fill_parent" android:layout_height="wrap_content"
android:gravity="center_horizontal"
android:minWidth="110sp" android:textColor="#66CCFF"
android:textStyle="bold" android:textSize="20sp" android:text="Default Text" />

<fragment xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/map"
android:layout_below="@id/top_message"
android:name="com.google.android.gms.maps.SupportMapFragment"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:gravity="center_horizontal" />

</RelativeLayout>

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent" >

<VideoView
android:visibility="invisible"
android:layout_height="fill_parent"
android:layout_width="fill_parent"
android:id="@+id/myVideo"
android:gravity="center"
android:layout_centerInParent="true" />

</RelativeLayout>

</FrameLayout>

MainActivity.java

public class MainActivity extends FragmentActivity implements LocationListener {

private GoogleMap googleMap;
private TextView distanceTextView;
private VideoView videoView;
private LocationManager locationManager;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

// setup overlay for text
distanceTextView = (TextView)findViewById(R.id.top_message);
distanceTextView.setText("Text set onCreate");

// setup overlay for video
videoView = (VideoView) findViewById(R.id.myVideo);

// setup google map data
googleMap = ((SupportMapFragment)(getSupportFragmentManager().findFragmentById(R.id.map))).getMap();
googleMap.setMapType(GoogleMap.MAP_TYPE_NORMAL);
googleMap.getUiSettings().setCompassEnabled(true);
googleMap.getUiSettings().setZoomControlsEnabled(true);
googleMap.setMyLocationEnabled(true);

locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 5000, 1, this);
Location location = locationManager.getLastKnownLocation(LocationManager.GPS_PROVIDER);

// set current location and move map to that location
if (location != null) {
LatLng myPosition = new LatLng(location.getLatitude(),location.getLongitude());
googleMap.animateCamera(CameraUpdateFactory.newLatLngZoom(myPosition, 15));
}

// if below is uncommented then secondvideo will also appear
//playVideo(new String("android.resource://" + getPackageName() + "/" + R.raw.firstvideo));

}

public void onLocationChanged(Location location) {
locationManager.removeUpdates(this);
distanceTextView.setText("Location has changed");
playVideo(new String("android.resource://" + getPackageName() + "/" + R.raw.secondvideo));
}

private void playVideo(String videoFile) {
videoView.setVisibility(View.VISIBLE);
videoView.setZOrderOnTop(true);

MediaController mediaController = new MediaController(this);
mediaController.setAnchorView(videoView);
videoView.setMediaController(mediaController);
videoView.setVideoPath(videoFile);
videoView.start();
videoView.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
videoView.setVisibility(View.INVISIBLE);
videoView.setZOrderOnTop(false);
videoView.stopPlayback();
return false;
}
});
}

@Override
public void onProviderDisabled(String arg0) {
// TODO Auto-generated method stub
}

@Override
public void onProviderEnabled(String arg0) {
// TODO Auto-generated method stub
}

@Override
public void onStatusChanged(String arg0, int arg1, Bundle arg2) {
// TODO Auto-generated method stub

}

}

最佳答案

setZOrderOnTop()不能用于动态更改 z 级别。来自docs ,

Note that this must be set before the surface view's containing window is attached to the window manager.

附加 View 后,调用 setZOrderOnTop()没有任何影响。一种解决方案是始终拥有 VideoView在顶部并控制它是否被 .setVisibility() 看到就像你已经在做的那样。您可以使用一个电话 setZOrderOnTop()onCreate() ,这可能就是您在 onCreate 中播放视频时它起作用的原因.

关于Android 视频播放但 VideoView 没有出现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14269001/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com