Une vidéo peut-elle jouer une vidéo stockée sur un stockage interne?

J'essaie de fournir à mes utilisateurs la possibilité d'utiliser un stockage externe ou interne. Je visualise des images et des vidéos (de nature scientifique). Lorsque vous stockez le support sur la carte SD, tout va bien. Mais lorsque je stocke les médias en interne, seules les images s'affichent. Peu importe ce que j'essaie, je reçois diverses erreurs en essayant de charger et d'afficher les médias stockés sous applicationcontext.getFilesDir ().

Existe-t-il une astuce pour configurer le contenu d'une vidéo sur un tel fichier?

  • Créer un fichier de propriétés à l'aide de gradle
  • Erreur lors du démarrage de l'émulateur
  • Gson désérialise les objets imbriqués avec InstanceCreator
  • Comment compiler GCC pour Android?
  • Masquer / Afficher la barre d'action Option Option de menu pour différents fragments
  • Comment EditText n'accepte-t-il que des valeurs entières ou flottantes?
  • Un ContentResolver peut-il m'aider?

    Sur une note connexe, est-il considéré comme une mauvaise forme pour supposer que le stockage externe existe?

    Merci d'avance,

    Sid

    Voici une version qui échoue avec "Impossible de lire la vidéo. Désolé, cette vidéo ne peut pas être lue". Mais j'ai beaucoup d'autres modes d'échec. Je peux copier la vidéo interne vers le stockage temporaire (externe) et la lire, de sorte que cette copie vers l'interne crée effectivement un film valide. Il échoue seulement lorsque j'essaie de le jouer directement à partir du stockage interne.

    videoFile = new File(this.getFilesDir() + File.separator + "test.mp4"); InputStream data = res.openRawResource(R.raw.moviegood); try { OutputStream myOutputStream = new FileOutputStream(videoFile); byte[] buffer = new byte[8192]; int length; while ( (length = data.read(buffer)) > 0 ) { myOutputStream.write(buffer); } //Close the streams myOutputStream.flush(); myOutputStream.close(); data.close(); } catch (FileNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } vview.setKeepScreenOn(true); vview.setVideoPath(videoFile.getAbsolutePath()); vview.start(); 

  • Comment puis-je créer un AVD Android pour Samsung Galaxy Note 2?
  • Existe-t-il une API officielle pour l'application Google Play Store?
  • Comment obtenir un JSON mal formé dans Retrofit 2
  • L'émulateur Android est basé sur QEMU. Puis-je utiliser KVM avec elle?
  • Trouver ce qui a violé la politique StrictMode
  • Comment obtenir uniquement City, State, Country from lat, long in Android
  • 6 Solutions collect form web for “Une vidéo peut-elle jouer une vidéo stockée sur un stockage interne?”

    MediaPlayer nécessite que le fichier en cours de lecture possède des autorisations lisibles dans le monde entier. Vous pouvez afficher les autorisations du fichier avec la commande suivante dans shell shell:

     ls -al /data/data/com.mypackage/myfile 

    Vous verrez probablement "-rw ——", ce qui signifie que seul le propriétaire (votre application, et non MediaPlayer) a des autorisations de lecture / écriture.

    Remarque: votre téléphone doit être enraciné afin d'utiliser la commande ls sans spécifier le fichier (dans la mémoire interne).

    Si votre téléphone est enraciné, vous pouvez ajouter des autorisations de lecture mondiale dans le shell AdB avec la commande suivante:

     chmod o+r /data/data/com.mypackage/myfile 

    Si vous devez modifier ces autorisations de manière programmée (nécessite un téléphone enraciné!), Vous pouvez utiliser la commande suivante dans le code de votre application:

     Runtime.getRuntime().exec("chmod o+r /data/data/com.mypackage/myfile"); 

    Ce qui est essentiellement une commande linux. Consultez https://help.ubuntu.com/community/FilePermissions pour en savoir plus sur chmod.

    EDIT: a trouvé une autre approche simple ici (utile pour ceux qui n'ont pas de téléphones enracinés). Étant donné que l'application possède le fichier, elle peut créer un descripteur de fichier et le transmettre à mediaPlayer.setDataSource ():

     FileInputStream fileInputStream = new FileInputStream("/data/data/com.mypackage/myfile"); mediaPlayer.setDataSource(fileInputStream.getFD()); 

    Cette approche évite complètement le problème de l'autorisation.

    Vous pouvez utiliser:

     videoView.setVideoURI(Uri.parse(file.getAbsolutePath())); 

    Si le fichier est lisible dans le monde entier

    Ou vous pouvez utiliser un fournisseur de contenu

    J'ai affiché une implémentation VideoView personnalisée là- bas .

    L'implémentation VideoView a la setVideoFD(FileDescriptor fd) et résout ce problème.

    J'ai rencontré ce thread avec le même problème, je télécharge mes vidéos depuis le Web vers le stockage interne, il s'ensuit que lors de la sauvegarde, vous pouvez spécifier le mode RW, c'est-à-dire passer de PRIVATE à WORLD_READABLE

     URL url = new URL(_url); InputStream input = null; FileOutputStream output = null; try { String outputName = "video.mp4"; input = url.openConnection().getInputStream(); output = c.openFileOutput(outputName, Context.MODE_WORLD_READABLE); int read; byte[] data = new byte[5120]; //5MB byte array while ((read = input.read(data)) != -1) output.write(data, 0, read); return true; } finally { if (output != null) output.close(); if (input != null) input.close(); } } 

    Pour plus de détails, vérifiez ce tutoriel

     public class AndroidVideoViewExample extends Activity { private VideoView myVideoView; private int position = 0; private ProgressDialog progressDialog; private MediaController mediaControls; @Override protected void onCreate(final Bundle savedInstanceState) { super.onCreate(savedInstanceState); // set the main layout of the activity setContentView(R.layout.activity_main); //set the media controller buttons if (mediaControls == null) { mediaControls = new MediaController(AndroidVideoViewExample.this); } //initialize the VideoView myVideoView = (VideoView) findViewById(R.id.video_view); // create a progress bar while the video file is loading progressDialog = new ProgressDialog(AndroidVideoViewExample.this); // set a title for the progress bar progressDialog.setTitle("JavaCodeGeeks Android Video View Example"); // set a message for the progress bar progressDialog.setMessage("Loading..."); //set the progress bar not cancelable on users' touch progressDialog.setCancelable(false); // show the progress bar progressDialog.show(); try { //set the media controller in the VideoView myVideoView.setMediaController(mediaControls); //set the uri of the video to be played myVideoView.setVideoURI(Uri.parse("android.resource://" + getPackageName() + "/" + R.raw.kitkat)); } catch (Exception e) { Log.e("Error", e.getMessage()); e.printStackTrace(); } myVideoView.requestFocus(); //we also set an setOnPreparedListener in order to know when the video file is ready for playback myVideoView.setOnPreparedListener(new OnPreparedListener() { public void onPrepared(MediaPlayer mediaPlayer) { // close the progress bar and play the video progressDialog.dismiss(); //if we have a position on savedInstanceState, the video playback should start from here myVideoView.seekTo(position); if (position == 0) { myVideoView.start(); } else { //if we come from a resumed activity, video playback will be paused myVideoView.pause(); } } }); } @Override public void onSaveInstanceState(Bundle savedInstanceState) { super.onSaveInstanceState(savedInstanceState); //we use onSaveInstanceState in order to store the video playback position for orientation change savedInstanceState.putInt("Position", myVideoView.getCurrentPosition()); myVideoView.pause(); } @Override public void onRestoreInstanceState(Bundle savedInstanceState) { super.onRestoreInstanceState(savedInstanceState); //we use onRestoreInstanceState in order to play the video playback from the stored position position = savedInstanceState.getInt("Position"); myVideoView.seekTo(position); } } 

    Vous ne pouvez pas simplement le jouer directement.

    Vous devez implémenter ContentProvider puis passer la méthode définie Uri à setVideoUri (uri).

    coAndroid est un fan Android de Google, tout sur les téléphones Android, Android Wear, Android Dev et Android Games Apps.