gpt4 book ai didi

Android应用程序无法读取外部存储文件

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:27:02 28 4
gpt4 key购买 nike

我正在创建一个仅供私有(private)使用的应用程序......那么它并不那么重要,请尊重你的时间:P

我想做的是一个从数据库中读取并播放声音的应用程序。我已经创建了数据库,并且可以播放 res/raw 文件夹中的声音。但是,有数千个文件可以播放,一些新文件将成为应用程序的一部分,其他文件将在未来被删除。所以,添加一个简单的文件会让我每次都下载整个应用程序(~1 GB)(或者我错了?)。相反,我想到了读取 Excel 文件并从 SD 卡播放声音。但我不能……据我所知:

Apps are not allowed to write (delete, modify ...) to external storage except to their package-specific directories.

我将文件放入 /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

我尝试了几种创建新文件对象或使用媒体播放器播放声音的方法(正如我之前所说,播放 res/raw 文件没有问题)但是 file.exists 总是返回 false 或声音不播放:

String filePath = getExternalFilesDir(null) + "/myfile.mp3"; //returns correct file path
File file = new File(filePath);

File file = new File(getExternalFilesDir(null).getPath(), "myfile.mp3");

MediaPlayer mp;
mp = MediaPlayer.create(this, Uri.parse(getExternalFilesDir(null).getPath() + "/myfile.mp3"));

minSdkVersion 设置为 19,所以我不需要 list 中的那一行:

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

我已经包含了那行并且没有任何改变:

<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS" />

我也试图用其他文件扩展名来做到这一点。此外,来自 here 的解决方案没有帮助。我的手机是 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;
}

关于Android应用程序无法读取外部存储文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38226470/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com