【问题标题】:Not able to run on android 9+ devices无法在 android 9+ 设备上运行
【发布时间】:2022-02-08 18:23:23
【问题描述】:

清单:-

MainActivity.java

public class MainActivity extends AppCompatActivity {

ListView listView;
String[] items;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    listView = findViewById(R.id.listview);
    runtimePermission();
}

public void runtimePermission(){

    Dexter.withContext(this).withPermission(Manifest.permission.READ_EXTERNAL_STORAGE)
            .withListener(new PermissionListener() {
                @Override
                public void onPermissionGranted(PermissionGrantedResponse permissionGrantedResponse) {
                    displaySongs();
                }

                @Override
                public void onPermissionDenied(PermissionDeniedResponse permissionDeniedResponse) {

                }

                @Override
                public void onPermissionRationaleShouldBeShown(PermissionRequest permissionRequest, PermissionToken permissionToken) {
                    permissionToken.continuePermissionRequest();
                }
            }).check();
}

public ArrayList<File> findSongs(File file){

    ArrayList<File> arrayList = new ArrayList<>();

    File[] files = file.listFiles();

    for (File singlefile : files){
        if (singlefile.isDirectory() && !singlefile.isHidden()) {
            arrayList.addAll(findSongs(singlefile));
        } else {
            if (singlefile.getName().endsWith(".mp3") || singlefile.getName().endsWith(".wav")){
                arrayList.add(singlefile);
            }
        }
    }
    return arrayList;
}

public void displaySongs(){
    final ArrayList<File> mysongs = findSongs(Environment.getExternalStorageDirectory());
    items = new String[mysongs.size()];
    for (int i = 0; i < mysongs.size(); i++) {
        items[i] = mysongs.get(i).getName().replace(".mp3", "").replace(".wav", "");
    }
    ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, items );
    listView.setAdapter(adapter);
    }
}

activity_main.xml

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">

<ListView
    android:id="@+id/listview"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:divider="@android:color/transparent"
    android:dividerHeight="10.0sp"
    android:padding="8dp" />
</RelativeLayout>

Logcat :-

2022-02-08 14:56:52.834 9348-9348/com.example.mymusic E/AndroidRuntime: 致命异常: main 进程:com.example.mymusic,PID:9348 java.lang.RuntimeException: 传递结果 ResultInfo{who=@android:requestPermissions:, request=42, result=-1, data=Intent { act=android.content.pm.action.REQUEST_PERMISSIONS (has extras) }} 失败活动 {com.example.mymusic/com.karumi.dexter.DexterActivity}:java.lang.NullPointerException:尝试在空对象引用上调用虚拟方法 'void android.widget.ListView.setAdapter(android.widget.ListAdapter)' 在 android.app.ActivityThread.deliverResults(ActivityThread.java:4977) 在 android.app.ActivityThread.handleSendResult(ActivityThread.java:5018) 在 android.app.servertransaction.ActivityResultItem.execute(ActivityResultItem.java:51) 在 android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:135) 在 android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:95) 在 android.app.ActivityThread$H.handleMessage(ActivityThread.java:2073) 在 android.os.Handler.dispatchMessage(Handler.java:107) 在 android.os.Looper.loop(Looper.java:225) 在 android.app.ActivityThread.main(ActivityThread.java:7563) 在 java.lang.reflect.Method.invoke(本机方法) 在 com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:539) 在 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:994) 原因:java.lang.NullPointerException:尝试在空对象引用上调用虚拟方法 'void android.widget.ListView.setAdapter(android.widget.ListAdapter)' 在 com.example.mymusic.MainActivity.displaySongs(MainActivity.java:79) 在 com.example.mymusic.MainActivity$1.onPermissionGranted(MainActivity.java:39) 在 com.karumi.dexter.MultiplePermissionsListenerToPermissionListenerAdapter.onPermissionsChecked(未知来源:35) 在 com.karumi.dexter.MultiplePermissionListenerThreadDecorator$1.run(未知来源:8) 在 com.karumi.dexter.MainThread.execute(未知来源:6) 在 com.karumi.dexter.MultiplePermissionListenerThreadDecorator.onPermissionsChecked(未知来源:7) 在 com.karumi.dexter.DexterInstance.onPermissionsChecked(未知来源:56) 在 com.karumi.dexter.DexterInstance.updatePermissionsAsGranted(未知来源:26) 在 com.karumi.dexter.DexterInstance.onPermissionRequestGranted(未知来源:0) 在 com.karumi.dexter.Dexter.onPermissionsRequested(未知来源:4) 在 com.karumi.dexter.DexterActivity.onRequestPermissionsResult(未知来源:51) 在 android.app.Activity.dispatchRequestPermissionsResult(Activity.java:8408) 在 android.app.Activity.dispatchActivityResult(Activity.java:8253)

【问题讨论】:

  • 删除标签android-studio。该标签用于与 Android Studio 产品相关的问题/问题。您的问题是一个通用的 Android 问题。
  • MainActivity 中的变量 listView 从未初始化。调用listView.setAdapter(adapter); 会产生NullPointerException

标签: java android android-storage


【解决方案1】:

MainActivity 中的变量 listView 永远不会被初始化。调用listView.setAdapter(adapter); 会产生NullPointerException

onCreate() 你需要做这样的事情(在调用setContentView() 之后:

listView = (ListView)findViewById(R.id.listview);

【讨论】:

  • logcat :- E/AndroidRuntime: FATAL EXCEPTION: main java.lang.NullPointerException: Attempt to get length of null array 原因:java.lang.NullPointerException: Attempt to get length of null array 问题在 android 10+ 中具有存储权限,否则相同的代码在 android 9 以下设备上正常工作。
  • 首先谢谢你,是的,我读到了,但我不知道如何实现。我想访问存储在设备中的音乐文件,请指导或分享一些参考资料。
猜你喜欢
  • 2019-11-20
  • 1970-01-01
  • 1970-01-01
  • 2020-11-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-08-16
相关资源
最近更新 更多