2011-05-08 53 views
2

我在与Eclipse(我有一个.NET背景)Android的Java编程新手,达不到在模拟器的视频播放(也不在Android的HTC Desire)的Android - 播放视频不起作用

我的设置:

  • Eclipse IDE的Java开发人员,版本:太阳神服务版本2
  • Android SDK和ADT Eclipse插件

我使用的视频是3GP视频我RECO用我的HTC愿望。

我已经试过2种方法与

  1. VideoView
  2. SurfaceView用MediaPlayer的 我拿出这本书从雷托迈耶“专业的Android 2应用开发”的。

我靶向的Android 2.2(无论是在模拟器,以及对我的HTC Desire)

详细

1 VideoView方法

getDuration总是返回-1即使在调用videoView.start()之后,isPlaying也是false。 下面是我使用的代码:

public class MyActivity extends Activity 
{ 
    private static final String FileName = "VIDEO0015.3gp"; 
    private static final String MyTag = "MyActivity"; 

    /** Called when the activity is first created. */ 
    @Override 
    public void onCreate(Bundle savedInstanceState) 
    {    
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 

     VideoView videoView = (VideoView) findViewById(R.id.videoView1); 
     videoView.setKeepScreenOn(true); 

     File clip=new File(Environment.getExternalStorageDirectory(), FileName); 
     if (clip.exists()) 
     { 
      videoView.setVideoPath(clip.getAbsolutePath()); 
      int duration = videoView.getDuration(); 

      if (videoView.canSeekForward()) 
      { 
       videoView.seekTo(duration/2); 
      } 

      videoView.start(); 
     } 
    } 
} 

main.xml中的文件:

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:orientation="vertical" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
    > 
<VideoView android:id="@+id/videoView1" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content"> 
</VideoView> 
</LinearLayout> 

2. SurfaceView与MediaPlayer的 通过这种方法,我得到正确的时间(大约15秒)并且打击是真实的。 无论是什么都看不到,视频播放从未完成。

我会添加代码,如果有人想检查它。


感谢您的帮助,我越来越绝望。

弗兰克

+0

似乎很奇怪,你可以发布您的main.xml(不要忘了将它格式化为代码 - 只是将其标记,然后按Ctrl + K),并有你尝试播放另一个视频(没有记录在手机上)? – MByD 2011-05-08 11:04:50

+0

@MByD:感谢您的帮助。我已经添加了main.xml文件的内容。我在布局设置上玩了一下,但没有变化。我真的是一个新手,所以也许我做了一些根本性错误的事情。关于其他视频,我尝试了另一种视频,但失败时显示不同的错误。因为第二次尝试(使用surfaceView和mediaPlayer)返回正确的持续时间,并说isPlaying = true我认为视频正常。我会检查另一个视频。是否有任何视频可以保证正常工作? – FrankE 2011-05-09 17:05:32

+0

我试过了你的代码,得到了相同的结果(有效的视频),我不知道为什么,也许我会有时间来检查它。 – MByD 2011-05-09 17:25:25

回答

0

我之前遇到过类似的问题。您是否尝试“暗示”3gp视频?你可以看看here。希望它会有所帮助。

0

嗨,我写了一些测试视频查看计划之前。 我想也许是你的视频文件路径错了? 这里是我的测试代码,

public class VideoActivity extends Activity { 
    /** Called when the activity is first created. */ 
    @Override 
public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.video_view_layout); 

     VideoView videoView = (VideoView) findViewById(R.id.VideoView); 
     MediaController mediaController = new MediaController(this); 
     mediaController.setAnchorView(videoView); 

     Uri video = Uri.parse("/sdcard/test_video.mp4"); 
     videoView.setMediaController(mediaController); 
     videoView.setVideoURI(video); 
     videoView.start(); 
     } 
} 

和XML是,

<?xml version="1.0" encoding="utf-8"?> 
<VideoView 
     xmlns:android="http://schemas.android.com/apk/res/android" 
     android:id="@+id/VideoView" 
     android:layout_width="fill_parent" 
     android:layout_height="fill_parent" 
     android:layout_gravity="center"> 
</VideoView> 

AndroidManifest。xml,

 <activity android:name=".VideoActivity" 
        android:label="@string/app_name" 
        android:screenOrientation="landscape" 
        android:theme="@android:style/Theme.NoTitleBar" 
        android:noHistory="true"> 
      <intent-filter> 
       <action android:name="android.intent.action.MAIN" /> 
       <category android:name="android.intent.category.LAUNCHER" /> 
      </intent-filter> 
     </activity> 

希望能帮助你。

+0

在这种情况下,视频文件被放入/ sdcard根级别。 – Rebecca 2011-05-09 07:43:38

+0

感谢您的帮助。我试过你的代码,但是我找到了_No启动器活动!该推出只会同步设备上的应用程序包!_我是一个新手,所以我不知道问题的原因。我认为我的视频文件的路径是可以的,因为我在代码中使用'File clip = new File(Environment.getExternalStorageDirectory(),FileName)来检查它。 if(clip.exists())' – FrankE 2011-05-09 17:22:27

0

如果您还没有找到解决方案,如果视频未处于播放状态,VideoView.getDuration()将返回-1。视频在准备好之前未处于播放状态。所以在设置URI后直接调用VideoView.getDuration()并不能保证视频已经准备好。

我发现这个通过查看VideoView来源:

@Override 
public int getDuration() { 
    if (isInPlaybackState()) { 
     return mMediaPlayer.getDuration(); 
    } 

    return -1; 
} 

的解决方案是一个OnPreparedListener设置为您VideoView,并获得/使用时间,当影片播放准备。然后您可以使用VideoView.getDuration()MediaPlayer.getDuration(),它们几乎相同。

解决方案:

public class MyActivity extends Activity { 
private static final String FileName = "VIDEO0015.3gp"; 
private static final String MyTag = "MyActivity"; 

/** 
* Called when the activity is first created. 
*/ 
@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 

    VideoView videoView = (VideoView) findViewById(R.id.videoView1); 
    videoView.setKeepScreenOn(true); 

    File clip = new File(Environment.getExternalStorageDirectory(), FileName); 
    if (clip.exists()) { 
     videoView.setVideoPath(clip.getAbsolutePath()); 
     videoView.setOnPreparedListener(new MediaPlayer.OnPreparedListener() { 
      @Override 
      public void onPrepared(MediaPlayer mp) { 
       int duration = videoView.getDuration(); 
       if (videoView.canSeekForward()) { 
        videoView.seekTo(duration/2); 
        videoView.start(); 
       } 
      } 
     }); 
    } 
} 

}