2016-06-14 6 views
0

Я использую приведенный ниже код для воспроизведения видео с SD-карты с помощью Video View для Android. Я поместил видеофайл с именем Video.mp4 во внешний корневой каталог хранилища. Но когда я запускаю свое приложение на своем смартфоне и переключаюсь на свою видео-активность с помощью кода ниже для Video.java, я вижу уведомление с кнопкой «ОК», в котором говорится, что видео нельзя воспроизвести. (Немецкий: «Видео kann nicht wiedergegeben werden.»)Приложение не может воспроизводить видео с SD-карты, несмотря на то, что код выглядит нормально

Это недостающее разрешение в моем AndroidManifest.xml?

Заранее благодарим за любые подсказки и помощь.

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: Спасибо за ваш ответ. У меня нет общей проблемы с вложением видео в мое приложение. Когда я создаю сырец папку и поместить видео testvideo.mp4 в нем затем заменить

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

с

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

в моем коде, все работает отлично, и я вижу мое видео играть в моем приложении. Примечание. Мне пришлось переименовать Video.mp4 в testvideo.mp4, потому что заглавные буквы не разрешены для видеороликов, вызванных из необработанной папки. Моя проблема только в том, чтобы получить путь к видео на моей SD-карте.

@ Lonnie Zamora: Спасибо за ваш ответ. Кажется, это не проблема формата или кодирования. testvideo.mp4 - это просто Video.mp4, переименованный и помещенный в мою сырую папку. И он играет хорошо на код ниже:

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: Спасибо за ваш ответ. Я попробовал ваше предложение, но это не решило проблему.

С наилучшими пожеланиями,

EDIT 2:@CommonsWare Это, кажется, это не распространяется быть недостающим разрешение или отсутствует проблема запроса разрешения. Я выполнил следующую логику разрешения времени выполнения и посмотрел: «Видео воспроизводится. Не требуется никаких разрешений». что для меня означает (Manifest.permission.READ_EXTERNAL_STORAGE == PackageManager.PERMISSION_GRANTED) был истинным

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

Что касается воспроизведения мультимедиа Android, в котором объясняется, как читать аудио и видеофайлы, для этого требуется только разрешение на Интернет: https://developer.android.com/guide/topics/media/mediaplayer.html#manifest –

+0

Используйте журналы или тосты просто для проверки правильности пути –

+0

Убедитесь, что ваше видео закодировано с использованием кодировщика H.264. –

ответ

0

РЕШЕНИЕ@all решение для доступа к внешней SD-карты:

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

вместо

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

ПРИЧИНА:.

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

Environment.getExternalStorageDirectory() GetPath() поставляет путь к внутреннему чипу хранения на моем смартфоне (HUAWEI P8), который монтируется как SD-карта, но я но не внешняя SD-карта.

0

Заменить

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

(который является недействительным, поскольку в нем отсутствует схема)

с:

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

См. EDIT в исходном сообщении –

+0

@NoureddineOuertani: «Это недостающее разрешение в моем AndroidManifest.xml?» - ну, как минимум, вам нужно READ_EXTERNAL_STORAGE, и для этого, в свою очередь, может потребоваться реализовать логику разрешения времени выполнения, если ваша 'targetSdkVersion' равна 23 или выше. См. Https://developer.android.com/training/permissions/requesting.html – CommonsWare

+0

Я использую -другие - разрешение 'READ_EXTERNAL_STORAGE' в ​​моем AndroidManifest.xml. Мой целевой SDK на самом деле 23. Я только что проверил мой build.gradle (Module: app) ... Я буду реализовывать логику разрешения времени выполнения и написать здесь, решит ли она проблему. –