我尝试使用MediaController播放音乐.我希望MediaController出现,直到按下"后退"按钮.现在我尝试下面的代码:
MediaController mediaController = new MediaController(this){
@Override
public void setMediaPlayer(MediaPlayerControl player) {
super.setMediaPlayer(player);
this.show();
}
@Override
public void show(int timeout) {
super.show(0);
}
//instead of press twice with press once "back" button to back
@Override
public boolean dispatchKeyEvent(KeyEvent event) {
if(event.getKeyCode() == KeyEvent.KEYCODE_BACK) {
Activity a = (Activity)getContext();
a.finish();
}
return true;
}
};
Run Code Online (Sandbox Code Playgroud)
但是当MediaController可见时它仍然是一个麻烦.当MediaController出现触摸屏幕时,MediaController将隐藏.我也尝试过以下代码:
@Override
public boolean onTouchEvent(MotionEvent event) {
Log.d("screen","touch");
return true;
}
Run Code Online (Sandbox Code Playgroud)
但它没有用.该字符串未在Logcat中显示.有人有想法吗?
嗨有一种方法可以改变mediacontroller中文本的颜色,显示音频文件的总时间和剩余时间.在Android 2.3上,时间清晰可见但是当我的应用程序在Android 4.0或4.1上运行时,显示进度条任一侧的时间的文本太暗.目前我正在扩展mediacontroller类来创建我自己的媒体控制器,它不会消失,是否有什么我可以添加到这个类?任何帮助将非常感激.
public class WillMediaController extends MediaController {
public WillMediaController(Context context) {
super(context);
}
@Override
public void hide() {
// Do Nothing to show the controller all times
}
@Override
public boolean dispatchKeyEvent(KeyEvent event)
{
if (event.getKeyCode() == KeyEvent.KEYCODE_BACK)
{
((Activity) getContext()).finish();
}else{
super.dispatchKeyEvent(event);
}
if (event.getKeyCode() == KeyEvent.KEYCODE_VOLUME_DOWN ||
event.getKeyCode() == KeyEvent.KEYCODE_VOLUME_UP) {
// don't show the controls for volume adjustment
return super.dispatchKeyEvent(event);
}
return true;
}
}
Run Code Online (Sandbox Code Playgroud)
谢谢
我正在使用MediaController.MediaPlayerControl以在我的自定义视图底部显示MediaController,但我无法让它正常工作.当我第一次播放音乐时,应该有暂停按钮可见,但是有播放,当我按下那个按钮时,音乐正确暂停,状态保持不变,之后它正常工作.此外,当我播放下一首歌曲时,旧的MediaController小部件与新的小部件重叠.有时,在播放音乐时,进度/搜索栏不会刷新.它只是在按下MediaController上的某些内容时自动更新(播放/暂停,转发等).
我发现这些问题与我的相似,但我认为他们得到的答案不会解决我的问题.
这是我初始化控制器的方式:
private void setController()
{
controller = new MusicController(this);
controller.setPrevNextListeners(new View.OnClickListener() {
@Override
public void onClick(View v) {
playNext();
}
}, new View.OnClickListener() {
@Override
public void onClick(View v) {
playPrev();
}
});
controller.setMediaPlayer(this);
controller.setAnchorView(findViewById(R.id.song_list));
controller.setEnabled(true);
}
Run Code Online (Sandbox Code Playgroud)
这是我显示控制器的方式:
public void playMusic()
{
musicSrv.playSong(); //Play song in a service
setController();
controller.show(0);
controller.requestFocus();
}
Run Code Online (Sandbox Code Playgroud) 我有一个mediacontroller的问题,这部分代码在不同的设备上完美无瑕作为Acer Liquid(姜饼),Archos 43(froyo)e Archos 32(froyo)......
VideoView videoView = (VideoView) findViewById(R.id.videoView1);
MediaController mediaController = new MediaController(this);
mediaController.setAnchorView(videoView);
File filevideo = new File(Environment.getExternalStorageDirectory() + "/edizionitsm/firenze/map_" + map_n + "/",filename + "_" + language + ".mp4");
Uri video = Uri.fromFile(filevideo);
videoView.setMediaController(mediaController);
videoView.setVideoURI(video);
videoView.start();
Run Code Online (Sandbox Code Playgroud)
...但是在Point of View Pro Tab2(姜饼)上,它在活动开始时崩溃了.
11-09 14:12:59.640: E/AndroidRuntime(31433): FATAL EXCEPTION: main
11-09 14:12:59.640: E/AndroidRuntime(31433): java.lang.RuntimeException: Unable to start activity ComponentInfo{edizionitsm.archeoplayer/edizionitsm.archeoplayer.Player}: java.lang.NullPointerException
11-09 14:12:59.640: E/AndroidRuntime(31433): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1647)
11-09 14:12:59.640: E/AndroidRuntime(31433): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1663)
11-09 14:12:59.640: E/AndroidRuntime(31433): at android.app.ActivityThread.access$1500(ActivityThread.java:117)
11-09 14:12:59.640: E/AndroidRuntime(31433): at …
Run Code Online (Sandbox Code Playgroud) 我有一个应用程序,通过MediaPlayer播放无线电作为服务.是否可以在Service类中使用MediaController?问题是我可以使用findViewById.
我试着让我的LinearLayout进入onPrepeared方法......
public class RadioPlayer extends Service implements OnPreparedListener, MediaController.MediaPlayerControl {
@Override
public void onCreate() {
super.onCreate();
mediaPlayer = new MediaPlayer();
mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
mediaPlayer.setOnPreparedListener(this);
mediaController = new MediaController(this, false); mediaPlayer.setDataSource(url);
mediaPlayer.prepareAsync();
}
@Override
public void onPrepared(MediaPlayer mediaPlayer) {
mediaPlayer.start();
mediaController.setMediaPlayer(this);
LayoutInflater inflater = (LayoutInflater) getSystemService(LAYOUT_INFLATER_SERVICE);
View layout = inflater.inflate(R.layout.main, (ViewGroup) findViewById(R.id.main_program_view));
mediaController.setAnchorView(layout);
}
}
Run Code Online (Sandbox Code Playgroud)
main.xml文件
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/main_program_view"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:background="#FFFFFF"
android:orientation="vertical" >
<TextView
android:id="@+id/now_playing_text"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_marginTop="30dp"
android:gravity="center"
android:text="@string/na_antenie"
android:textColor="#333333" />
</LinearLayout>
Run Code Online (Sandbox Code Playgroud) 所以我有以下代码可以正常工作:
VideoView videoView = (VideoView)findViewById(R.id.videoView1);
videoView.setVideoPath("android.resource://" + getPackageName() + "/raw/"+R.raw.intro);
MediaController controller = new MediaController(this);
controller.setAnchorView(videoView);
controller.setPadding(0, 0, 0, 500);
videoView.setMediaController(controller);
videoView.setZOrderOnTop(true);
Run Code Online (Sandbox Code Playgroud)
但是,如果我在具有较小屏幕的手机上测试应用程序,MediaController的位置就像s**t.所以我尝试在xml文件中定义它,以便它在不同的设备上保持相同的位置
<MediaController
android:id="@+id/mediaController1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@+id/videoView1"
android:layout_centerHorizontal="true"
android:layout_marginTop="30dp" >
</MediaController>
Run Code Online (Sandbox Code Playgroud)
并将代码更改为
VideoView videoView = (VideoView)findViewById(R.id.videoView1);
videoView.setVideoPath("android.resource://" + getPackageName() + "/raw/"+R.raw.intro);
MediaController controller = (MediaController)findViewById(R.id.mediaController1);
videoView.setMediaController(controller);
videoView.setZOrderOnTop(true);
Run Code Online (Sandbox Code Playgroud)
但现在,当我启动它时,应用程序崩溃了.这里有什么我想念的吗?如何使用XML中定义的MediaController?
为了得到一个MediaControllerCompat
实例中我使用getSupportMediaController()
在FragmentActivity
.但是这种方法已被弃用.我必须使用哪种方法代替此方法?
我有视频视频,当视频开始时,媒体控制器显示3秒钟.我想隐藏媒体控制器,除非我点击屏幕.我试过了
MediaController mc= new MediaController();
mc.hide();
Videoview.setMediaController(mc);
..
..
..
Run Code Online (Sandbox Code Playgroud)
但它没有用..有什么建议吗?
我VideoView
用来显示视频.
我的要求是一个MediaController
wid play/Pause, Stop, & Volume Contoller
..我试过
MediaController mc = new MediaController(this);
View mMediaControllerView = (View)findViewById(R.id.mediaController1);
mc.setAnchorView(mMediaControllerView);
videoView.setMediaController(mc);
Run Code Online (Sandbox Code Playgroud)
添加一个imageview
,layout
但这似乎没有影响MediaController
需要一些指导/暗示继续进行......
谢谢.
我需要将触摸事件捕获到MediaController
进度滑块,以便MediaPlayer
在手指抬离滑块之前不会发生更新.
[也许我的情况很独特:我正在为每个"节目"播放多个"堆栈"的流媒体视频.在上一个堆栈完成之前,不会加载下一个堆栈.滑块需要表示所有堆栈的持续时间,"拇指"的进度需要表示总持续时间.这是很容易通过覆盖完成getBufferPercentage()
,getCurrentPosition()
以及getDuration()
方法MediaPlayerControl
]
更有问题的是沿着时间线来回"擦洗"(移动拇指).如果它导致数据源set
多次与seekTo
每次移动一起,那么事情会很快陷入困境并崩溃.如果MediaPlayer在用户完成擦除之前没有执行任何操作会更好.
正如其他人所写,是的,最好编写我自己的MediaController实现.但为什么要重做所有这些工作呢?我尝试扩展MediaController,但很快就变得复杂了.我只想抓住滑块的触摸事件!