Я использую приведенный ниже код для воспроизведения видео с 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
}
}
Что касается воспроизведения мультимедиа Android, в котором объясняется, как читать аудио и видеофайлы, для этого требуется только разрешение на Интернет: https://developer.android.com/guide/topics/media/mediaplayer.html#manifest –
Используйте журналы или тосты просто для проверки правильности пути –
Убедитесь, что ваше видео закодировано с использованием кодировщика H.264. –