определение исключений, как узнать, что ловить - PullRequest
0 голосов
/ 03 февраля 2012

Я понимаю основы попытки и поймать столько же, сколько вы попробуете какой-то код, отыщите ошибки, которые происходят, и поймаете их, а затем что-то делаете на основе ошибки.У меня есть код, который при запуске ищет полный видеофайл, существует на 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

Я думаю, что оно включено здесь, но я не знаю, какчтобы перевести это в правильную попытку и поймать рутину Надеюсь, кто-то может помочь

1 Ответ

2 голосов
/ 03 февраля 2012

Чтобы поймать исключение, должно быть сгенерировано исключение. Похоже, вы уже ловите базовый уровень Exception, который поймает любое исключение uncaught из слоя медиаплеера. Поэтому они не бросают то, что не ловят сами.

Таким образом, речь идет не о перехвате исключений на данном этапе, а о регистрации для получения уведомлений об ошибках, предоставляемых платформой. Поиск здесь показывает способ регистрации слушателя для ошибок. Означает ли это, что ошибка не будет отображаться, как вы описали, неизвестно. Я подозреваю, что это все еще покажет. Но вы можете не иметь никакого контроля над этим.

...