尽管代码看起来不错,但应用程序无法播放 SD 卡中的视频
App can´t play a video from the SD-Card despite the fact that the code looks fine
我使用下面的代码使用 Android 的视频视图播放我的 SD 卡中的视频。我在外部存储根目录下放置了一个名为Video.mp4 的视频文件。但是当在我的智能手机上启动我的应用程序并使用下面的 Video.java 代码切换到我的视频 activity 时,我看到一个带有确定按钮的通知,说视频无法播放。 (德语:"Video kann nicht wiedergegeben werden.")
我的 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
}
}
编辑:
@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,因为从 raw 文件夹调用的视频不允许使用大写字母。
我的问题只是获取我 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:感谢您的回答。我尝试了你的建议,但没有解决问题。
此致,
编辑 2: @CommonsWare 这似乎不是缺少权限或缺少权限请求的问题。我实现了以下运行时权限逻辑并看到 "Video is playing. No permissioon request was needed." 这对我来说意味着 (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
}
}
替换
Uri.parse(Environment.getExternalStorageDirectory().getPath() + "/Video.mp4")
(无效,因为缺少方案)
与:
Uri.fromFile(new File(Environment.getExternalStorageDirectory(), "Video.mp4"))
解决方案 @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 卡。
我使用下面的代码使用 Android 的视频视图播放我的 SD 卡中的视频。我在外部存储根目录下放置了一个名为Video.mp4 的视频文件。但是当在我的智能手机上启动我的应用程序并使用下面的 Video.java 代码切换到我的视频 activity 时,我看到一个带有确定按钮的通知,说视频无法播放。 (德语:"Video kann nicht wiedergegeben werden.")
我的 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
}
}
编辑: @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,因为从 raw 文件夹调用的视频不允许使用大写字母。 我的问题只是获取我 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:感谢您的回答。我尝试了你的建议,但没有解决问题。
此致,
编辑 2: @CommonsWare 这似乎不是缺少权限或缺少权限请求的问题。我实现了以下运行时权限逻辑并看到 "Video is playing. No permissioon request was needed." 这对我来说意味着 (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
}
}
替换
Uri.parse(Environment.getExternalStorageDirectory().getPath() + "/Video.mp4")
(无效,因为缺少方案)
与:
Uri.fromFile(new File(Environment.getExternalStorageDirectory(), "Video.mp4"))
解决方案 @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 卡。