-3

I am making an app music player in Android Studio. After the installation was finished, an app on opening asks for media permission. The problem occurs after permission is granted, the app automatically closes.

I don't know why, but I found in logcat following message NullPointerException : Attempt to get length of null array

My class is :

public class MainActivity extends AppCompatActivity {

    ListView listView;
    String[] items;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        listView = (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) {
                        displaySong();
                    }

                    @Override
                    public void onPermissionDenied(PermissionDeniedResponse permissionDeniedResponse) {

                    }

                    @Override
                    public void onPermissionRationaleShouldBeShown(PermissionRequest permissionRequest, PermissionToken permissionToken) {
                        permissionToken.continuePermissionRequest();
                    }
                }).check();
    }
    
    public ArrayList<File> findSong(File file)
    {
        ArrayList<File> arrayList = new ArrayList<>();
        File[] files = file.listFiles();

        assert files != null;
        for (File singleFile : files) {
            if (singleFile.isDirectory() && !singleFile.isHidden()) {
                arrayList.addAll(findSong(singleFile));
            } else {
                if (singleFile.getName().endsWith(".mp3") || singleFile.getName().endsWith(".wav")) {
                    arrayList.add(singleFile);
                }
            }
        }
        return arrayList;
    }
    
    void displaySong()
    {
        final ArrayList<File> mySongs = findSong(Environment.getStorageDirectory());
        items = new String[mySongs.size()];
        for (int i=0;i<mySongs.size();i++)
        {
            items[i] = mySongs.get(i).getName().toString().replace(".mp3","").replace(".wav","");
        }

        customAdapter customAdapter = new customAdapter();
        listView.setAdapter(customAdapter);
    }

    class customAdapter extends BaseAdapter
    {

        @Override
        public int getCount() {
            return items.length;
        }

        @Override
        public Object getItem(int i) {
            return null;
        }

        @Override
        public long getItemId(int i) {
            return 0;
        }

        @Override
        public View getView(int position, View convertView, ViewGroup parent) {
            View view = getLayoutInflater().inflate(R.id.list_item,null);
            TextView txtSong = view.findViewById(R.id.txtSong);
            txtSong.setSelected(true);
            txtSong.setText(items[position]);
            return view;
        }
    }
}

Where I can found issue?

here is logcat

2021-08-05 22:17:03.244 22457-22457/com.devilteched.rexplayer E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.devilteched.rexplayer, PID: 22457
java.lang.RuntimeException: Unable to start activity ComponentInfo{com.devilteched.rexplayer/com.devilteched.rexplayer.MainActivity}: java.lang.NullPointerException: Attempt to get length of null array
    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3550)
    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3710)
    at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:85)
    at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:135)
    at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:95)
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2139)
    at android.os.Handler.dispatchMessage(Handler.java:106)
    at android.os.Looper.loop(Looper.java:236)
    at android.app.ActivityThread.main(ActivityThread.java:8047)
    at java.lang.reflect.Method.invoke(Native Method)
    at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:600)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:967)
 Caused by: java.lang.NullPointerException: Attempt to get length of null array
    at com.devilteched.rexplayer.MainActivity.findSong(MainActivity.java:66)
    at com.devilteched.rexplayer.MainActivity.findSong(MainActivity.java:68)
    at com.devilteched.rexplayer.MainActivity.findSong(MainActivity.java:68)
    at com.devilteched.rexplayer.MainActivity.displaySong(MainActivity.java:79)
    at com.devilteched.rexplayer.MainActivity$1.onPermissionGranted(MainActivity.java:46)
    at com.karumi.dexter.MultiplePermissionsListenerToPermissionListenerAdapter.onPermissionsChecked(Unknown Source:35)
    at com.karumi.dexter.DexterInstance$1.run(Unknown Source:43)
    at com.karumi.dexter.MainThread.execute(Unknown Source:6)
    at com.karumi.dexter.DexterInstance.checkMultiplePermissions(Unknown Source:71)
    at com.karumi.dexter.DexterInstance.checkPermissions(Unknown Source:0)
    at com.karumi.dexter.Dexter.check(Unknown Source:10)
    at com.devilteched.rexplayer.MainActivity.runtimePermission(MainActivity.java:58)
    at com.devilteched.rexplayer.MainActivity.onCreate(MainActivity.java:37)
    at android.app.Activity.performCreate(Activity.java:8126)
    at android.app.Activity.performCreate(Activity.java:8098)
    at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1310)
    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3523)
    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3710) 
    at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:85) 
    at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:135) 
    at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:95) 
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2139) 
    at android.os.Handler.dispatchMessage(Handler.java:106) 
    at android.os.Looper.loop(Looper.java:236) 
    at android.app.ActivityThread.main(ActivityThread.java:8047) 
    at java.lang.reflect.Method.invoke(Native Method) 
    at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:600) 
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:967) 

2021-08-05 22:17:03.248 22457-22457/com.devilteched.rexplayer D/OOMEventManagerFK: checkEventAndDumpForJE: 0 2021-08-05 22:17:03.276 22457-22457/com.devilteched.rexplayer I/Process: Sending signal. PID: 22457 SIG: 9

  • to who ever is marking this down - I think the OP would needs some constructive advice on how to make a better question. If you want to mark it down that's fair enough but please say why other wise they'll not be able to do the right thing in the future – Stormcloud Aug 05 '21 at 16:21
  • 1
    Please include the full NPE stack trace from logs as that may help readers locate the code producing the NPE. –  Aug 05 '21 at 16:43
  • thanks for posting the log (didn't even notice the recursive call) - asserts do not work in release mode so I'd replace the `assert` with something like `if (files == null) return arrayList;` which returns an empty list on that condition. –  Aug 05 '21 at 16:58

1 Answers1

0

You dont have check for this line of code:

    final ArrayList<File> mySongs = findSong(Environment.getStorageDirectory());

Your method findSong() returns null or empty List.

Can you please add folloing block:

final ArrayList<File> mySongs = findSong(Environment.getStorageDirectory());
if(!mySongs.isEmpty())
{
    items = new String[mySongs.size()];
    for (int i=0;i<mySongs.size();i++)
    {
        items[i] = mySongs.get(i).getName().toString().replace(".mp3","").replace(".wav","");
    }
}
Djordje Nedovic
  • 559
  • 8
  • 20