异常确定如何知道要捕获什么

时间:2012-02-03 00:14:10

标签: android media-player try-catch

我确实理解try和catch的基础知识,就像你尝试一些代码并查找发生的错误并捕获它们然后根据错误做一些事情。我有代码,当运行查找完整的视频文件存在于SD卡上它播放视频如果它没有完成它将它下载到SD卡然后我希望它播放。 这是我的代码块

import java.io.BufferedInputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.URL;
import java.net.URLConnection;

import android.app.Activity;
import android.app.Dialog;
import android.app.ProgressDialog;
import android.content.Context;
import android.content.Intent;
import android.graphics.PixelFormat;
import android.net.Uri;
import android.os.AsyncTask;
import android.os.Bundle;
import android.os.Environment;
import android.util.Log;
import android.view.Window;
import android.widget.MediaController;
import android.widget.Toast;
import android.widget.VideoView;

public class VideoActivity extends Activity {

private static final String TAG = "MyActivity";    
public static final int DIALOG_DOWNLOAD_PROGRESS = 0;
public static final Context ACTION_VIEW = null;
private ProgressDialog mProgressDialog;
public String url = "";
public String fName = "";
public String vidName = "";
public String path="";
//final VideoView videoView = (VideoView) findViewById(R.id.videoView1);

/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    requestWindowFeature(Window.FEATURE_NO_TITLE);     
    final String[] myAPP_FILES = getResources().getStringArray(R.array.APP_FILES);
    final String[] myAPP_FILENAMES = getResources().getStringArray(R.array.APP_FILENAMES);
    final String[] myAPP_NAMES = getResources().getStringArray(R.array.APP_NAMES);
    final int[] myAPP_SIZES = getResources().getIntArray(R.array.APP_SIZES);

    setContentView(R.layout.video);
    getWindow().setFormat(PixelFormat.TRANSLUCENT); 

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

    Bundle extras = getIntent().getExtras();

    url = myAPP_FILES[extras.getInt("key") ];
    fName = myAPP_FILENAMES[extras.getInt("key") ];
    vidName = myAPP_NAMES[extras.getInt("key") ];

    int fsize = (myAPP_SIZES[extras.getInt("key") ] -1 )*1000;

    File file1 = new File(Environment.getExternalStorageDirectory(), fName );
    if (file1.exists()) {
        if(file1.length() < fsize) {
            file1.delete();
        }
    }


    loadMedia();

    Toast.makeText(
            getApplicationContext(),
            "" + file1.length()+ " " + fsize,
            Toast.LENGTH_LONG).show();  

        String pathfile = Environment.getExternalStorageDirectory() + "/" +fName;

        try {

        Uri video = Uri.parse(pathfile);
        videoView.setMediaController(mediaController);
        videoView.setVideoURI(video);
        videoView.start();
        } catch (Exception w) {}

}

private void loadMedia() {        

    //Check for media file download if not on sdcard
    File file = new File(Environment.getExternalStorageDirectory(), fName );

    if (!file.exists()) {
        new DownloadFileAsync().execute(url);
    }
}

@Override
protected Dialog onCreateDialog(int id) {
    switch (id) {
    case DIALOG_DOWNLOAD_PROGRESS:
        mProgressDialog = new ProgressDialog(this);
        mProgressDialog.setMessage("Downloading to SD: "  + vidName + "\n...Please allow download to finish completely...");
        mProgressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
        mProgressDialog.setCancelable(true);
        mProgressDialog.show();
        return mProgressDialog;
    default:
        return null;
    }
}

class DownloadFileAsync extends AsyncTask<String, String, String> {

    @Override
    protected void onPreExecute() {
        super.onPreExecute();
        showDialog(DIALOG_DOWNLOAD_PROGRESS);
    }

    @Override
    protected String doInBackground(String... aurl) {
        int count;

    try {

    URL url = new URL(aurl[0]);
    URLConnection conexion = url.openConnection();
    conexion.connect();

    int lengthOfFile = conexion.getContentLength();
    Log.d("ANDRO_ASYNC", "Length of file: " + lengthOfFile);

    InputStream input = new BufferedInputStream(url.openStream(), 1024);
    OutputStream output = new FileOutputStream("/sdcard/" + fName);

    byte data[] = new byte[1024];

    long total = 0;

        while ((count = input.read(data)) != -1) {
            total += count;
            publishProgress(""+(int)((total*100)/lengthOfFile));
            output.write(data, 0, count);
        }

        output.flush();
        output.close();
        input.close();

    } catch (Exception e) {}
    return null;

    }
    protected void onProgressUpdate(String... progress) {
         Log.d("ANDRO_ASYNC",progress[0]);
         mProgressDialog.setProgress(Integer.parseInt(progress[0]));
    }

    @Override
    protected void onPostExecute(String unused) {
        dismissDialog(DIALOG_DOWNLOAD_PROGRESS);
    }
}

}

在操作中,显示微调器,用户可以选择视频。然后检查SD卡上是否存在该文件,如果不是,则开始下载并显示进度条。这是问题当时弹出一条消息说:

    CANNOT PLAY VIDEO
    Sorry, this video cannot be played.

下载正在后台进行,我可以看到进度条但是它变暗了 我不希望出现此消息。 我想抓住这个并且什么都不做,所以消息不会出现

在代码中我处理loadmedia函数,然后设置要播放的视频。我需要尝试捕捉此步骤寻找此错误消息,但我不知道该寻找什么 在我的logcat中,我看到了这个

02-02 09:35:29.257: W/MediaPlayer(13311): info/warning (1, 26)
02-02 09:35:29.257: E/MediaPlayer(13311): error (1, -4)
02-02 09:35:29.277: I/MediaPlayer(13311): Info (1,26)
02-02 09:35:29.277: E/MediaPlayer(13311): Error (1,-4)
02-02 09:35:29.277: D/VideoView(13311): Error: 1,-4

我认为它包含在这里,但我不知道如何将其转换为有效的try和catch例程 希望有人可以提供帮助

1 个答案:

答案 0 :(得分:2)

要捕获异常,必须抛出异常。看起来您已经捕获了基准级Exception,它将从媒体播放器层捕获任何未捕获的异常。因此,他们不会抛弃任何他们没有抓住自己的东西。

所以这不是关于此时捕获异常,而是注册接收框架提供的错误通知。查看here显示了一种注册侦听器以查找错误的方法。这是否意味着错误不会像您所描述的那样出现,这是未知的。我怀疑它还会显示出来。但你可能无法控制它。