我正在创建一个仅供私人使用的应用...那么那不是那么重要,请尊重您的时间:P
我要制作的是一个从数据库读取声音并播放声音的应用程序。我已经建立了数据库,并且能够从res / raw文件夹播放声音。但是,有数千个文件要播放,一些新文件将成为该应用程序的一部分,而其他文件将在以后删除。因此,添加一个简单文件使我每次都可以下载整个应用程序(〜1 GB)(或者我错了吗?)。相反,我想到了读取Excel文件并从SD卡播放声音的操作。但据我所知...
除了其特定于程序包的目录外,应用程序均不得写入(删除,修改...)外部存储。
我将文件放入/ storage / emulated / 0 / Android / data / my_package_folder / files文件夹。我读了很多话题,没有任何帮助。
Environment.MEDIA_MOUNTED.equals(extStorageState) //returns true
Environment.MEDIA_MOUNTED_READ_ONLY.equals(extStorageState) //returns false
Run Code Online (Sandbox Code Playgroud)
我尝试了几种创建新文件对象或使用mediaplayer播放声音的方法(正如我之前说过的,播放res / raw文件没有问题),但是file.exists总是返回false或声音不播放:
String filePath = getExternalFilesDir(null) + "/myfile.mp3"; //returns correct file path
File file = new File(filePath);
Run Code Online (Sandbox Code Playgroud)
要么
File file = new File(getExternalFilesDir(null).getPath(), "myfile.mp3");
Run Code Online (Sandbox Code Playgroud)
要么
MediaPlayer mp;
mp = MediaPlayer.create(this, Uri.parse(getExternalFilesDir(null).getPath() + "/myfile.mp3"));
Run Code Online (Sandbox Code Playgroud)
minSdkVersion设置为19,因此在清单中不需要该行:
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
Run Code Online (Sandbox Code Playgroud)
我已经包含了这一行,没有任何改变:
<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS" />
Run Code Online (Sandbox Code Playgroud)
我也尝试使用其他文件扩展名来做到这一点。同样,这里的解决方案也无济于事。我的手机是Samsung Galaxy Grand Prime(SM-G530FZ),Android v.5.0.2。请帮忙!:)
这是@Nisarg的代码,必须对其进行一些清理:
import android.Manifest;
import android.content.pm.PackageManager;
import android.media.MediaPlayer;
import android.os.Build;
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.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.Toast;
import java.io.File;
public class MainActivity extends AppCompatActivity implements OnClickListener {
Button readExcelButton;
static String TAG = "ExelLog";
MediaPlayer mpintro;
@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
if (Build.VERSION.SDK_INT == Build.VERSION_CODES.M) {
Toast.makeText(this, "Permission checking", Toast.LENGTH_SHORT).show();
checkPermission();
}
readExcelButton = (Button) findViewById(R.id.readExcel);
readExcelButton.setOnClickListener(this);
}
public void onClick(View v)
{
switch (v.getId())
{
case R.id.readExcel:
String filePath = getExternalFilesDir(null) + "/p0000.mp3";
File file = new File(filePath);
file.setReadable(true);
file.setWritable(true);
if (!isExternalStorageAvailable() || isExternalStorageReadOnly()) {
Toast.makeText(this, "Ext storage not available or read only", Toast.LENGTH_SHORT).show();
}
else {
Toast.makeText(this, "Ext storage available", Toast.LENGTH_SHORT).show();
}
if (file.exists()){
Toast.makeText(this, "File found", Toast.LENGTH_SHORT).show();
}
else {
Toast.makeText(this, getExternalFilesDir(null) + "/p0000.mp3 - File not found", Toast.LENGTH_LONG).show();
}
break;
}
}
private void checkPermission() {
if (ContextCompat.checkSelfPermission(this,
Manifest.permission.WRITE_EXTERNAL_STORAGE)
!= PackageManager.PERMISSION_GRANTED && ContextCompat.checkSelfPermission(this,
Manifest.permission.READ_EXTERNAL_STORAGE)
!= PackageManager.PERMISSION_GRANTED) {//Can add more as per requirement
ActivityCompat.requestPermissions(this,
new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE,Manifest.permission.READ_EXTERNAL_STORAGE},
123);
} else {
}
}
@Override
public void onRequestPermissionsResult(int requestCode, String permissions[], int[] grantResults) {
switch (requestCode) {
case 123: {
if (grantResults.length > 0
&& grantResults[0] == PackageManager.PERMISSION_GRANTED) {
//Peform your task here if any
} else {
checkPermission();
}
return;
}
}
}
public static boolean isExternalStorageReadOnly() {
String extStorageState = Environment.getExternalStorageState();
if (Environment.MEDIA_MOUNTED_READ_ONLY.equals(extStorageState)) {
return true;
}
return false;
}
public static boolean isExternalStorageAvailable() {
String extStorageState = Environment.getExternalStorageState();
if (Environment.MEDIA_MOUNTED.equals(extStorageState)) {
return true;
}
return false;
}
Run Code Online (Sandbox Code Playgroud)
}
您还必须拥有 READ_EXTERNAL_STORAGE 权限;对于外部存储而言,仅写入或读取是不够的,因为您必须同时使用两者
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
Run Code Online (Sandbox Code Playgroud)
您还可以在声明中阅读有关外部数据写入的更多信息
您无法阅读的原因是您没有添加该权限。一个好的规则是,如果您只需要读取,则仅使用读取权限。但如果你需要写,你需要写和读权限
编辑:
加载目录时,尝试以下操作:
file.setReadable(true);
file.setWritable(true);
Run Code Online (Sandbox Code Playgroud)
注意:这里的“文件”值是针对目录,而不是每个单独的文件(尽管这也可以正常工作)
从声明中:
从 API 级别 19 开始强制执行此权限。在 API 级别 19 之前,不强制执行此权限,所有应用程序仍然有权从外部存储读取数据。
如果我是正确的,这意味着该权限必须从 API 19 及更高版本开始,但不能在 API 19 之前