DevCorner: visualizziamo un video in una VideoView

Giuseppe Tripodi
Giuseppe Tripodi Tech Master
DevCorner: visualizziamo un video in una VideoView

Due settimane fa abbiamo approfittato di DevCorner per giocare un po' con le nuove API di Android 4.4 e mostrarvi come utilizzare il nuovo Storage Access Framework: questo martedì ci spingiamo leggermente oltre e, dopo aver prelevato un filmato tramite ACTION_OPEN_DOCUMENT o con il "vecchio" ACTION_GET_CONTENT vi faremo vedere come visualizzarlo in una VideoView.

Per prima cosa, come consuetudine, stabiliamo di cosa abbiamo bisogno nella nostra interfaccia: in questo caso mostreremo un label dove stampare il titolo, la VideoView necessaria per questo tutorial e un bottone per selezionare il video da lanciare.



    

      

        
    

A questo punto, nella nostra MainActivity definiamo glie elementi della nostra view e un MediaController; assegniamo inoltre un OnClickListener al bottone, che lancerà il metodo selectVideo().

public class MainActivity extends Activity implements OnClickListener, OnCompletionListener{
	private static final int PICK_FILE_REQUEST_CODE = 0;
	Button apriVideo;
	VideoView videoPlayer;
	TextView titolo;
	private MediaController ctlr;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		apriVideo = (Button) findViewById(R.id.apriFile);
		titolo = (TextView) findViewById(R.id.videoTitle);
		videoPlayer = (VideoView) findViewById(R.id.videoPlayer);
		apriVideo.setOnClickListener(this);
		videoPlayer.setOnClickListener(this);
	}

	@Override
	public void onClick(View v) {
		if(v==apriVideo)	
		{
		selectVideo();	

		}
	}

A questo punto dobbiamo ovviamente creare il metodo selectVideo, dove all'interno scriveremo il codice necessario per prelevare un filmato dal nostro telefono; per farlo, controlliamo prima la versione di Android installata: se combacia con KitKat lanciamo un intent al nuovo ACTION_OPEN_DOCUMENT, in caso contrario dovremo accontentarci del consueto ACTION_GET_CONTENT.

In qualsiasi caso, prima di lanciare lo StartActivityForResult, selezioniamo il tipo di file da cercare, in questo caso Video.

public void selectVideo()
	{
		Intent chooseIntent;

		if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT){
		    chooseIntent = new Intent(Intent.ACTION_OPEN_DOCUMENT);
		    chooseIntent.addCategory(Intent.CATEGORY_OPENABLE);
		}else{
		    chooseIntent = new Intent(Intent.ACTION_GET_CONTENT);
		}

		chooseIntent.setType("video/*");
		startActivityForResult(chooseIntent, PICK_FILE_REQUEST_CODE);

	}

Selezionato il video, dovremo stabilire quel che deve farci l'applicazione una volta ricevuto il video: nel nostro esempio, andiamo a salvarci il nome del filmato e il path dove si trova: inseriamo i risultati in un array (nel caso ci interessassero altri parametri da inserire successivamente) e con un cursor preleviamo le informazioni nella prima (e nel nostro caso unica) posizione, passandole a PlayVideo, metodo di cui parleremo successivamente.

	@Override
	public void onActivityResult(int requestCode, int resultCode,Intent resultData) {
	    if ((requestCode == PICK_FILE_REQUEST_CODE) && (resultCode == Activity.RESULT_OK)) {
	        if (resultData != null) {
	            Uri fileUri = resultData.getData();
	            String filePath = fileUri.toString();
	            String[] projection = {MediaStore.Video.Media.DISPLAY_NAME};
	            Cursor cursor = getContentResolver().query(fileUri,projection,null,null,null);
	            if(cursor.moveToFirst()){
	                int columnIndex = cursor.getColumnIndex(MediaStore.Video.Media.DISPLAY_NAME);
	                String displayName = cursor.getString(columnIndex);		
	                playVideo(displayName,filePath);
	            }
	        }
	    }
	}

Adesso non ci rimane che riprodurre effettivamente il video, assegnare i controlli (visibili cliccando sulla VideoView) e stampare il titolo del file in alto: faremo il tutto in un metodo, del quale c'è poco da spiegare.

L'unica nota che merita un'attenzione particolare è il setOnCompletionListener(): si tratta di un metodo che viene lanciato in caso di errori di riproduzione o al termine del filmato. Noi lo abbiamo usato per quest'ultimo scopo, facendo apparire un toast a fine riproduzione.

public void playVideo(String displayName, String filePath){
	titolo.setText(displayName);
	videoPlayer = (VideoView) findViewById(R.id.videoPlayer);
	ctlr=new MediaController(this);
	videoPlayer.setMediaController(ctlr);
        ctlr.setMediaPlayer(videoPlayer);
	videoPlayer.setOnCompletionListener(this);
	videoPlayer.setVideoPath(filePath);
	videoPlayer.start();
}

@Override
public void onCompletion(MediaPlayer mp) {
	// TODO Auto-generated method stub
	Toast.makeText(getApplicationContext(), "Il video è finito (nd Captain Obvious)", Toast.LENGTH_LONG).show();
}

Tutto fatto! Se non siete incappati in strani errori, dovreste essere in grado di riprodurre senza problemi un filmato sul vostro dispositivo tramite una VideoView. Come sempre, nel caso in cui abbiate qualche problema potete chiedere supporto sul nostro forum dove troverete anche i sorgenti completi e l'apk. Buon sviluppo a tutti!

Via: DevCorner