2016-06-14 12 views
0

Ich benutze den folgenden Code, um ein Video von meiner SD-Karte mit der Videoansicht von Android abzuspielen. Ich habe eine Videodatei mit dem Namen Video.mp4 im Stammverzeichnis des externen Speichers abgelegt. Aber wenn ich meine App auf meinem Smartphone starte und zu meinem Video mit dem unten stehenden Code für Video.java wechsle, sehe ich eine Benachrichtigung mit einer OK-Taste, die besagt, dass das Video nicht abgespielt werden kann. (Deutsch: "Video kann nicht wiedergegeben werden.")App kann kein Video von der SD-Karte abspielen, obwohl der Code gut aussieht

Ist es eine fehlende Berechtigung in meiner AndroidManifest.xml?

Vielen Dank im Voraus für Hinweise und Hilfe.

package com.noureddine_ouertani.www.wocelli50; 

import android.net.Uri; 
import android.os.Bundle; 
import android.os.Environment; 
import android.support.v7.app.AppCompatActivity; 
import android.widget.MediaController; 
import android.widget.VideoView; 


public class Video extends AppCompatActivity { 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_video); 
     getSupportActionBar().setHomeButtonEnabled(true); 
     getSupportActionBar().setDisplayHomeAsUpEnabled(true); 
     VideoView v = (VideoView) findViewById(R.id.videoView); 

     v.setVideoURI(Uri.parse(Environment.getExternalStorageDirectory().getPath() + "/Video.mp4")); 
     //Set media controller buttons 
     v.setMediaController(new MediaController(this)); 
     v.requestFocus(); 
     v.start(); //start Playback 

    } 
} 

EDIT: @Alexandre Martin: Vielen Dank für Ihre Antwort. Ich habe kein generelles Problem beim Einbetten von Videos in meine App. Wenn ich einen rohen Ordner erstellen und das Video testvideo.mp4 setze in ihm dann

v.setVideoURI(Uri.parse(Environment.getExternalStorageDirectory().getPath() + "/Video.mp4")); 

mit

v.setVideoURI(Uri.parse("android.resource://com.noureddine_ouertani.www.wocelli50/"+ R.raw.testvideo)); 

in meinem Code ersetzen, funktioniert alles einwandfrei und ich sehe mein Video in meiner app zu spielen. Anmerkung: Ich musste Video.mp4 in testvideo.mp4 umbenennen, da Großbuchstaben für Videos, die aus dem rohen Ordner aufgerufen werden, nicht erlaubt sind. Mein Problem ist nur, um den Weg zum Video auf meiner SD-Karte zu bekommen.

@Lonnie Zamora: Danke für Ihre Antwort. Es scheint kein Format- oder Codierungsproblem zu sein. testvideo.mp4 wird nur Video.mp4 umbenannt und in meinen Rohordner gelegt. Und es spielt gut mit dem folgenden Code:

package com.noureddine_ouertani.www.wocelli50; 

import android.net.Uri; 
import android.os.Bundle; 
import android.support.v7.app.AppCompatActivity; 
import android.widget.MediaController; 
import android.widget.VideoView; 


public class Video extends AppCompatActivity { 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_video); 
     getSupportActionBar().setHomeButtonEnabled(true); 
     getSupportActionBar().setDisplayHomeAsUpEnabled(true); 
     VideoView v = (VideoView) findViewById(R.id.videoView); 

     v.setVideoURI(Uri.parse("android.resource://com.noureddine_ouertani.www.wocelli50/"+ R.raw.testvideo)); 
     //Set media controller buttons 
     v.setMediaController(new MediaController(this)); 
     v.requestFocus(); 
     v.start(); //start Playback 

    } 
} 

@CommonsWare: Vielen Dank für Ihre Antwort. Ich habe deinen Vorschlag ausprobiert, aber das hat das Problem nicht gelöst.

Mit freundlichen Grüßen,

EDIT 2:@CommonsWare Es scheint nicht eine fehlende Erlaubnis oder eine fehlende Berechtigungsanfrage Problem zu sein. Ich habe die folgende Laufzeit-Berechtigungslogik implementiert und sehe "Video wird abgespielt. Es wurde keine Erlaubnisanfrage benötigt". Das bedeutet für mich, dass (Manifest.permission.READ_EXTERNAL_STORAGE == PackageManager.PERMISSION_GRANTED) stimmte

package com.noureddine_ouertani.www.wocelli50; 

import android.Manifest; 
import android.content.pm.PackageManager; 
import android.net.Uri; 
import android.os.Bundle; 
import android.os.Environment; 
import android.support.v4.app.ActivityCompat; 
import android.support.v4.content.ContextCompat; 
import android.support.v7.app.AppCompatActivity; 
import android.widget.MediaController; 
import android.widget.Toast; 
import android.widget.VideoView; 

public class Video extends AppCompatActivity { 

    final int REQUEST_READ_EXTERNAL_STORAGE = 1; 
    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_video); 


     if (ContextCompat.checkSelfPermission(this, Manifest.permission.READ_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) { 



      // Should we show an explanation? 
      if (ActivityCompat.shouldShowRequestPermissionRationale(this, Manifest.permission.READ_EXTERNAL_STORAGE)) { 
       Toast.makeText(getApplicationContext(), "Show explanation for requesting the permission to read the SD-card.", Toast.LENGTH_SHORT).show(); 
       // Show an expanation to the user *asynchronously* -- don't block 
       // this thread waiting for the user's response! After the user 
       // sees the explanation, try again to request the permission. 

      } else { 

       // No explanation needed, we can request the permission. 
       Toast.makeText(getApplicationContext(), "No explanation needed, we can request the permission.", Toast.LENGTH_SHORT).show(); 
       ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.READ_EXTERNAL_STORAGE}, REQUEST_READ_EXTERNAL_STORAGE); 

       // MY_PERMISSIONS_REQUEST_READ_CONTACTS is an 
       // app-defined int constant. The callback method gets the 
       // result of the request. 
     } 
     } else { 
      playmyvideo(); 
      Toast.makeText(getApplicationContext(), "Video is playing. No permissioon request was needed.", Toast.LENGTH_SHORT).show(); 
     } 
    } 

    @Override 
    public void onRequestPermissionsResult(int requestCode, String permissions[], int[] grantResults) { 
     switch (requestCode) { 
      case REQUEST_READ_EXTERNAL_STORAGE: { 
       // If request is cancelled, the result arrays are empty. 
       if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) { 
        playmyvideo(); 
        Toast.makeText(getApplicationContext(), "Video is playing after permissioon was granted.", Toast.LENGTH_SHORT).show(); 

       } else { 
        Toast.makeText(getApplicationContext(), "permission denied,Disable the functionality that depends on this permission.", Toast.LENGTH_SHORT).show(); 
        // permission denied, boo! Disable the 
        // functionality that depends on this permission. 
       } 
       return; 
      } 

      // other 'case' lines to check for other 
      // permissions this app might request 
     } 
    } 

    public void playmyvideo(){ 

     getSupportActionBar().setHomeButtonEnabled(true); 
     getSupportActionBar().setDisplayHomeAsUpEnabled(true); 
     VideoView v = (VideoView) findViewById(R.id.videoView); 
     v.setVideoURI(Uri.parse(Environment.getExternalStorageDirectory().getPath() + "/testvideo.mp4")); 
     //v.setVideoURI(Uri.parse("android.resource://com.noureddine_ouertani.www.wocelli50/"+ R.raw.testvideo)); 

     v.setMediaController(new MediaController(this)); 
     v.requestFocus(); 
     v.start(); //start Playback 
     } 
    } 
+0

In Bezug auf Android Media Playback, das erklärt, wie Audio- und Video-Dateien zu lesen, erfordert es nur Internet-Erlaubnis: https://developer.android.com/guide/topics/media/mediaplayer.html#manifest –

+0

Verwenden Sie Protokolle oder Toast Nur um zu überprüfen, ob der Pfad korrekt ist –

+0

Stellen Sie sicher, dass Ihr Video mit dem H.264-Encoder codiert ist. –

Antwort

0

SOLUTION@all Lösung für den Zugriff auf die externe SD-Karte:

v.setVideoURI(Uri.parse("/storage/sdcard1/testvideo.mp4")); 

statt

v.setVideoURI(Uri.parse(Environment.getExternalStorageDirectory().getPath() + "/testvideo.mp4")); 

Grund:.

Environment.getExternalStorageDirectory().getPath() == "/storage/emulated/0" 

Environment.getExternalStorageDirectory() getPath() liefert die Pfad zu einem internen Speicherchip auf meinem Smartphone (HUAWEI P8), der wie eine SD-Karte montiert ist, aber ich s nicht die externe SD-Karte.

0

ersetzen

Uri.parse(Environment.getExternalStorageDirectory().getPath() + "/Video.mp4") 

(das ist ungültig, da es fehlt ein Schema)

mit:

Uri.fromFile(new File(Environment.getExternalStorageDirectory(), "Video.mp4")) 
+0

Siehe Bearbeiten im ursprünglichen Beitrag –

+0

@NoureddineOuertani: "Ist es eine fehlende Berechtigung in meinem AndroidManifest.xml?" - Nun, Sie brauchen mindestens 'READ_EXTERNAL_STORAGE', was wiederum erfordert, dass Sie die Laufzeit-Berechtigungslogik implementieren, wenn Ihre 'targetSdkVersion' 23 oder höher ist. Siehe https://developer.android.com/training/permissions/requesting.html – CommonsWare

+0

Ich benutze unter anderem die Erlaubnis 'READ_EXTERNAL_STORAGE' in meiner AndroidManifest.xml. Mein Ziel-SDK ist in der Tat 23. Ich habe gerade meine build.gradle (Modul: app) überprüft ... Ich werde eine Laufzeit-Berechtigungslogik implementieren und hier schreiben, ob es das Problem gelöst hat. –