问题描述
请告诉我要实现的更改,以便我的应用也可以在android 10 API 29中成功运行。 这个应用程式可以在android 10以外的所有android装置上成功执行。 但是,我还添加了外部存储权限,以检索设备的音频文件并将其显示在我的AI音乐播放器的列表视图中。
我的MainActivity代码是
package rishabh.example.aimusicplayer;
import androidx.appcompat.app.AppCompatActivity;
import android.Manifest;
import android.os.Bundle;
import android.os.Environment;
import android.widget.ArrayAdapter;
import android.widget.ListView;
import android.widget.Toast;
import com.karumi.dexter.Dexter;
import com.karumi.dexter.PermissionToken;
import com.karumi.dexter.listener.PermissionDeniedResponse;
import com.karumi.dexter.listener.PermissionGrantedResponse;
import com.karumi.dexter.listener.PermissionRequest;
import com.karumi.dexter.listener.single.PermissionListener;
import java.io.File;
import java.util.ArrayList;
public class MainActivity extends AppCompatActivity
{
private String[] itemsAll;
private ListView mSongsList;
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mSongsList = findViewById(R.id.songsList);
appExternalStoragePermission();
}
public void appExternalStoragePermission()
{
Dexter.withContext(this)
.withPermission(Manifest.permission.READ_EXTERNAL_STORAGE)
.withListener(new PermissionListener() {
@Override
public void onPermissionGranted(PermissionGrantedResponse response)
{
displayAudioSongsName();
}
@Override
public void onPermissionDenied(PermissionDeniedResponse response)
{
}
@Override
public void onPermissionRationaleShouldBeShown(PermissionRequest permssion,PermissionToken token)
{
token.continuePermissionRequest();
}
}).check();
}
public ArrayList<File> readOnlyAudioSongs(File file) {
ArrayList<File> arrayList = new ArrayList<>();
File[] allFiles = file.listFiles();
if (null != file && null != file.listFiles())
{
for (File individualFile : allFiles)
{
if (individualFile.isDirectory() && !individualFile.isHidden())
{
arrayList.addAll(readOnlyAudioSongs(individualFile));
}
else
{
if (individualFile.getName().endsWith(".mp3") || individualFile.getName().endsWith(".aac") || individualFile.getName().endsWith(".wav") || individualFile.getName().endsWith(".wma"))
{
arrayList.add(individualFile);
}
}
}
}
return arrayList;
}
private void displayAudioSongsName()
{
final ArrayList<File> audioSongs = readOnlyAudioSongs(Environment.getExternalStorageDirectory());
itemsAll = new String[audioSongs.size()];
for (int songCounter = 0; songCounter<audioSongs.size(); songCounter++)
{
itemsAll[songCounter] = audioSongs.get(songCounter).getName();
}
ArrayAdapter<String> arrayAdapter = new ArrayAdapter<String>(MainActivity.this,android.R.layout.simple_list_item_1,itemsAll);
mSongsList.setAdapter(arrayAdapter);
}
}
我的构建gradle代码是
apply plugin: 'com.android.application'
android {
compileSdkVersion 30
buildToolsversion "30.0.2"
defaultConfig {
applicationId "rishabh.example.aimusicplayer"
minSdkVersion 19
targetSdkVersion 30
versionCode 1
versionName "1.0"
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'),'proguard-rules.pro'
}
}
}
dependencies {
implementation filetree(dir: "libs",include: ["*.jar"])
implementation 'androidx.appcompat:appcompat:1.2.0'
implementation 'androidx.constraintlayout:constraintlayout:2.0.1'
implementation 'com.karumi:dexter:6.2.1'
testImplementation 'junit:junit:4.12'
androidTestImplementation 'androidx.test.ext:junit:1.1.2'
androidTestImplementation 'androidx.test.espresso:espresso-core:3.3.0'
}
我的Android清单代码为
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="rishabh.example.aimusicplayer">
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.RECORD_AUdio" />
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/AppTheme">
android:grantUriPermissions="true"
android:requestLegacyExternalStorage="true"
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity android:name=".SmartPlayerActivity">
</activity>
</application>
</manifest>
解决方法
如果您使用的是android 10或更高版本,请不要忘记在清单中添加
android:grantUriPermissions="true"
android:requestLegacyExternalStorage="true"
,
在应用程序内部的清单中添加 android:requestLegacyExternalStorage="true"