Приложение не может воспроизводить видео с SD-карты, несмотря на то, что код выглядит хорошо

Я использую приведенный ниже код для воспроизведения видео с моей SD-карты с помощью Video View of Android. Я поместил видеофайл с именем Video.mp4 в корневой каталог внешнего хранилища. Но когда я запускаю приложение на своем смартфоне и переключаюсь на видео, используя код ниже для Video.java, я вижу уведомление с кнопкой OK о том, что видео не может быть воспроизведено. (Немецкий: "Видео Канн Нихт Видергегебен Верден".)

Это отсутствующее разрешение в моем 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

    }
}

РЕДАКТИРОВАТЬ:@ Александр Мартин: Спасибо за ваш ответ. У меня нет общих проблем с встраиванием видео в мое приложение. Когда я создаю сырую папку и помещаю видео 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, переименованный и помещенный в мою папку raw. И это хорошо работает с кодом ниже:

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

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

РЕДАКТИРОВАТЬ 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
        }
    }

2 ответа

Решение

SOLUTION @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-картой.

Замещать

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

(что недопустимо, поскольку в нем отсутствует схема)

с:

Uri.fromFile(new File(Environment.getExternalStorageDirectory(), "Video.mp4"))
Другие вопросы по тегам