从文件资源管理器打开视频文件并在我的视频播放器活动中播放

时间:2014-01-03 18:48:30

标签: android file video explorer video-player

我有我的VideoPlayerActivity.java,当我通过文件浏览器或其他应用程序从我的SD卡上按下视频文件时,我想打开

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.URL;
import java.net.URLConnection;

import android.app.Activity;
import android.content.ContentUris;
import android.content.Context;
import android.content.Intent;
import android.database.Cursor;
import android.media.AudioManager;
import android.media.MediaPlayer;
import android.media.MediaPlayer.OnBufferingUpdateListener;
import android.media.MediaPlayer.OnCompletionListener;
import android.media.MediaPlayer.OnErrorListener;
import android.media.MediaPlayer.OnPreparedListener;
import android.media.MediaPlayer.OnVideoSizeChangedListener;
import android.net.Uri;
import android.net.wifi.WifiManager;
import android.net.wifi.WifiManager.WifiLock;
import android.os.Bundle;
import android.os.Environment;
import android.os.Handler;
import android.os.Message;
import android.os.PowerManager;
import android.provider.MediaStore;
import android.util.Log;
import android.view.MotionEvent;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
import android.webkit.URLUtil;
import android.widget.EditText;
import android.widget.FrameLayout;
import android.widget.ImageButton;
import android.widget.MediaController.MediaPlayerControl;
import android.widget.TextView;
import android.widget.Toast;

public class VideoPlayerActivity extends Activity  implements  OnErrorListener, OnBufferingUpdateListener, 
    OnCompletionListener, OnPreparedListener, OnVideoSizeChangedListener, 
    MediaPlayerControl, SurfaceHolder.Callback, VideoControllerView.MediaPlayerControl, Runnable {


    private static final String TAG = "Player";



    MediaPlayer mediaPlayer;
    SurfaceHolder surfaceHolder;
    SurfaceView playerSurfaceView;
    VideoControllerView controller;


    private int position;


    private String videoPath;



    int videoWidth, videoHeight;






    @Override        
    protected void onCreate(Bundle icicle) {
        super.onCreate(icicle);
        setContentView(R.layout.video_player);
        playerSurfaceView = (SurfaceView)findViewById(R.id.playersurface);


        surfaceHolder = playerSurfaceView.getHolder();
        surfaceHolder.addCallback(this);

        videoPath = getIntent().getStringExtra("videoPath");


        // getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
       // getWindow().clearFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
    }


    @Override
    public void surfaceChanged(SurfaceHolder arg0, int arg1, int arg2, int arg3) {
        // TODO Auto-generated method stub

    }


    public String getRealPathFromURI(Context context, Uri contentUri) {
          Cursor cursor = null;
          try { 
            String[] proj = { MediaStore.Images.Media.DATA };
            cursor = context.getContentResolver().query(contentUri,  proj, null, null, null);
            int column_index = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
            cursor.moveToFirst();
            return cursor.getString(column_index);
          } finally {
            if (cursor != null) {
              cursor.close();
            }
          }
        }





    @Override
    public void surfaceCreated(SurfaceHolder arg0) {

        controller = new VideoControllerView(this);



          try {

            //  String filePath = Environment.getExternalStorageDirectory()+"/yourfolderNAme/yopurfile.mp3";

              /*  final String path = mPath.getText().toString();
                Log.v(TAG, "path: " + path);

                if (path.equals(current) && mediaPlayer != null) {
                    mediaPlayer.start();
                    return;
                }

                current = path;*/


             // Uri fileUri = ContentUris.withAppendedId(MediaStore.Audio.Media.EXTERNAL_CONTENT_URI, 166);

            //  Uri uri = MediaStore.Files.getContentUri("external");




                mediaPlayer = new MediaPlayer();
                mediaPlayer.setOnErrorListener(this);
                mediaPlayer.setOnBufferingUpdateListener(this);
                mediaPlayer.setOnCompletionListener(this);
                mediaPlayer.setOnPreparedListener(this);
                mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
               // mediaPlayer.prepareAsync();
                mediaPlayer.setScreenOnWhilePlaying(true);
                mediaPlayer.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {

                    @Override
                    public void onCompletion(MediaPlayer vmp) {
                        Intent intent = new Intent();
                        intent.setClass(VideoPlayerActivity.this, MainActivity.class);
                        startActivity(intent);
                    }
                }); 
                mediaPlayer.setDisplay(surfaceHolder);             
                mediaPlayer.setDataSource(videoPath);
                mediaPlayer.prepare();

                Log.v(TAG, "Duration: ===>" + mediaPlayer.getDuration());
                mediaPlayer.start();

                mediaPlayer.setWakeMode(getApplicationContext(), PowerManager.PARTIAL_WAKE_LOCK);
                WifiLock wifiLock = ((WifiManager) getSystemService(Context.WIFI_SERVICE))
                        .createWifiLock(WifiManager.WIFI_MODE_FULL, "mylock");
                    wifiLock.acquire();
                    wifiLock.release();

            } /*catch (Exception e) {
                Log.e(TAG, "error: "+ e.getMessage(), e);
                if (mediaPlayer != null) {
                    mediaPlayer.stop();
                    mediaPlayer.release();
                }
            }*/

      catch (IllegalArgumentException e) {
            e.printStackTrace();
        } catch (SecurityException e) {
            e.printStackTrace();
        } catch (IllegalStateException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }


    private void setDataSource(String path) throws IOException {

        if (!URLUtil.isNetworkUrl(path)) {
            mediaPlayer.setDataSource(path);
        } else {
            URL url = new URL(path);
            URLConnection cn = url.openConnection();
            cn.connect();
            InputStream stream = cn.getInputStream();
            if (stream == null)
                throw new RuntimeException("stream is null");
            File temp = File.createTempFile("mediaplayertmp", "dat");
            String tempPath = temp.getAbsolutePath();
            FileOutputStream out = new FileOutputStream(temp);
            byte buf[] = new byte[2000];    
            do {
                int numread = stream.read(buf);
                if (numread <= 0)
                    break;
                out.write(buf, 0, numread);
            } while (true);

            mediaPlayer.setDataSource(tempPath);

            try {
                stream.close();
            } catch (IOException ex) {
                Log.e(TAG, "error: " + ex.getMessage(), ex);
            }
        }

    }

    private final Handler handler = new Handler (){
        @Override
        public void handleMessage(Message msg) {
            final int currentPos = msg.getData().getInt("CurrentPosition");

        }

    };

    @Override
    public boolean onTouchEvent(MotionEvent event) {
            controller.show();

            /*if(controller.isShowing()) {
            controller.hide();
        }else {
            controller.show();
        }*/
        return false;
    }


        @Override
    protected void onDestroy() {
     // TODO Auto-generated method stub
     super.onDestroy();
     if (mediaPlayer != null) {
         mediaPlayer.release();
         mediaPlayer = null; 
     }
    }

    @Override
    protected void onPause() {
     // TODO Auto-generated method stub
     super.onPause();
     if (mediaPlayer != null) {
         mediaPlayer.release();
         mediaPlayer = null; 
     }
    }

    @Override
    public void surfaceDestroyed(SurfaceHolder arg0) {

    }



   // Implement MediaPlayer.OnPreparedListener    

    @Override
    public void onPrepared(MediaPlayer mp) {
        controller.setMediaPlayer(this);
        controller.setAnchorView((FrameLayout) findViewById(R.id.videoSurfaceContainer));
        mediaPlayer.start();
    }

 // End MediaPlayer.OnPreparedListener

    // Implement VideoMediaController.MediaPlayerControl
    @Override
    public boolean canPause() {
        return true;
    }

    @Override
    public boolean canSeekBackward() {
        return true;
    }

    @Override
    public boolean canSeekForward() {
        return true;
    }

    @Override
    public int getBufferPercentage() {
        return 0;
    }

   @Override
    public int getCurrentPosition() {
     return mediaPlayer.getCurrentPosition();
    }

    @Override
    public int getDuration() {
        return mediaPlayer.getDuration();
    }

    @Override
    public boolean isPlaying() {
        return mediaPlayer.isPlaying();
    }

    @Override
    public void pause() {
        mediaPlayer.pause();
    }

    @Override
    public void seekTo(int i) {
        mediaPlayer.seekTo(i);
    }

    @Override
    public void start() {
        mediaPlayer.start();
    }

    @Override
    public boolean isFullScreen() {
        return false;
    }

    @Override
    public void toggleFullScreen() {

    }
    // End VideoMediaController.MediaPlayerControl

    @Override
    public void onVideoSizeChanged(MediaPlayer mp, int width, int height) {
     videoWidth = width;
     videoHeight = height;
     Toast.makeText(getApplicationContext(), 
       String.valueOf(videoWidth) + "x" + String.valueOf(videoHeight), 
       Toast.LENGTH_SHORT).show();

     if (mediaPlayer.isPlaying()){
      surfaceHolder.setFixedSize(videoWidth, videoHeight);
     }
    }

    @Override
    public int getAudioSessionId() {
        // TODO Auto-generated method stub
        return 0;
    }

    @Override
    public void onBufferingUpdate(MediaPlayer arg0, int arg1) {
        // TODO Auto-generated method stub

    }

    @Override
    public void onCompletion(MediaPlayer mp) {
        // TODO Auto-generated method stub

    }

    @Override
    public boolean onError(MediaPlayer arg0, int arg1, int arg2) {
        // TODO Auto-generated method stub
        return false;
    }


    @Override
    public void run() {
        // TODO Auto-generated method stub
        controller = new VideoControllerView(this);

        try {
            mediaPlayer.setDataSource(videoSrc);
        } catch (IllegalArgumentException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (SecurityException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IllegalStateException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

         mediaPlayer.start();

        /* 
         Message msg = new Message();
            Bundle bundle = new Bundle();
            bundle.putInt("CurrentPosition", mediaPlayer.getCurrentPosition());
            msg.setData(bundle);
            handler.sendMessage(msg);
        //  handler.postDelayed(callBack, 500);*/
        }


    public int getPosition() {
        return position;
    }


    public void setPosition(int position) {
        this.position = position;
    }


    }   

我的logcat错误是

01-03 20:42:14.881: V/MediaPlayer(14737): setVideoSurfaceTexture
01-03 20:42:14.881: W/System.err(14737): java.lang.NullPointerException: uriString
01-03 20:42:14.901: W/System.err(14737):    at android.net.Uri$StringUri.<init>(Uri.java:468)
01-03 20:42:14.901: W/System.err(14737):    at android.net.Uri$StringUri.<init>(Uri.java:458)
01-03 20:42:14.901: W/System.err(14737):    at android.net.Uri.parse(Uri.java:430)
01-03 20:42:14.901: W/System.err(14737):    at android.media.MediaPlayer.setDataSource(MediaPlayer.java:1256)
01-03 20:42:14.901: W/System.err(14737):    at android.media.MediaPlayer.setDataSource(MediaPlayer.java:1221)

我的XML文件

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:keepScreenOn="true"
    android:id="@+id/video_container"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@android:color/black"
    android:gravity="center_horizontal|center_vertical"
    android:orientation="vertical" >

   <FrameLayout
        android:id="@+id/videoSurfaceContainer"
        android:layout_width="match_parent"
        android:layout_height="wrap_content">


       <SurfaceView
            android:id="@+id/playersurface"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"/>
    </FrameLayout>


</LinearLayout>

还有一个问题。我有这种用于流式传输的公共无效方法

private void setDataSource(String path) throws IOException {

    if (!URLUtil.isNetworkUrl(path)) {
        mediaPlayer.setDataSource(path);
    } else {
        URL url = new URL(path);
        URLConnection cn = url.openConnection();
        cn.connect();
        InputStream stream = cn.getInputStream();
        if (stream == null)
            throw new RuntimeException("stream is null");
        File temp = File.createTempFile("mediaplayertmp", "dat");
        String tempPath = temp.getAbsolutePath();
        FileOutputStream out = new FileOutputStream(temp);
        byte buf[] = new byte[2000];    
        do {
            int numread = stream.read(buf);
            if (numread <= 0)
                break;
            out.write(buf, 0, numread);
        } while (true);

        mediaPlayer.setDataSource(tempPath);

        try {
            stream.close();
        } catch (IOException ex) {
            Log.e(TAG, "error: " + ex.getMessage(), ex);
        }
    }

}

我如何用来从其他应用程序流式传输文件?

当我从主要活动播放视频时,当我退出并转到文件资源管理器并从自定义对话框中选择我的播放器并打开时,我遇到了uriString的问题......

1 个答案:

答案 0 :(得分:0)

浏览文件时,可以在缩略图上设置clicklistener。我使用此代码启动全屏视频编辑器:

        thumbNail.setOnClickListener(new OnClickListener() {
            public void onClick(View v) {

                if (pathType.equals("image")) {
                    <snip>
                }
                    else {
                            // music file
                    }
                else {
                    // must be video
                    Intent intent = new Intent();
                    intent.setAction(Intent.ACTION_VIEW);
                    intent.setDataAndType(Uri.parse(cmsURL + pathListFull,"video/mp4");

                    PackageManager packageManager = getActivity().getPackageManager();
                    List<ResolveInfo> activities = packageManager.queryIntentActivities(intent, 0);
                    boolean isIntentSafe = activities.size() > 0;

                    if (isIntentSafe) {
                        startActivity(intent);
                    }
                    else {
                        Log.d("SHOWFILE", "no intents available");
                    }
                }

            }
        });