android - App crashes after package Java classes into package - Stack Overflow

I am writing a new app which requires users to grant permissions. My app finishes and it works smoothly

I am writing a new app which requires users to grant permissions. My app finishes and it works smoothly when I put all the java classes, including MainActivity.java inside the same root folder (com.example.permission).

Then, I want to combine my current project with another one. Since the new combination consists of so many java class (more than 10 java classes) and it will be very messy and difficult to manage if I simply put all the java classes inside the same folder, I separate my java classes and categorize them into several groups according to the functions.

This is the original one(only consists of 5 java classes):

And this is what I want to re-anize (and later I want to introduce even more packages):

Here is my MainActivity.java:

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

    @Override
    public void onRequestPermissionsResult(int requestCode,
                                           @NonNull String[] permissions,
                                           @NonNull int[] grantResults)
    {
        super.onRequestPermissionsResult(requestCode, permissions, 
        grantResults);

        OnPermissionsResult onPermissionResult = new 
        OnPermissionsResult(MainActivity.this,MainActivity.this, 
        requestCode,
        permissions, grantResults);

        onPermissionResult.onPermissionsResult();
    }


    @Override
    protected void onStart()
    {
        super.onStart();
    }

    @Override
    protected void onResume()
    {
        super.onResume();

        // Re-check the permission grant when onResume().

        if (ContextCompat.checkSelfPermission(MainActivity.this,
                Manifest.permission.CAMERA) != 
                PackageManager.PERMISSION_GRANTED)
        {
            CheckPermission checkPermission =
                    new CheckPermission(MainActivity.this, 
                    MainActivity.this);
            checkPermission.askPermissionBox(new String[] 
           {PERMISSION_CAMERA}, CAMERA);
        }
    }

Here is my OnPermissionResult.java:

public class OnPermissionsResult
{
private Context mycontext;
private Activity myactivity;
private int[] mygrandResults;
private String[] mypermissions;
private int myrequestCode;
int permissionChecker = PackageManager.PERMISSION_GRANTED;


public OnPermissionsResult(Context context, Activity activity, int requestCode,
                           @NonNull String[] permissions, @NonNull int[] grantResults)
{
    this.myactivity = activity;
    this.mycontext = context;
    this.mygrandResults = grantResults;
    this.mypermissions = permissions;
    this.myrequestCode = requestCode;
}

public void onPermissionsResult()
{
    for (int permission: mygrandResults)
    {
        permissionChecker = permissionChecker + permission;
    }

    if (permissionChecker == PackageManager.PERMISSION_GRANTED &&
        mygrandResults.length > 0)
    {
        OnPermissionGranted onPermissionGranted =
            new OnPermissionGranted(myrequestCode, mycontext, myactivity);
        onPermissionGranted.skip_to_next_permission(myrequestCode, myactivity);
    }

    else if (!ActivityCompat.shouldShowRequestPermissionRationale
            (myactivity, mypermissions[0]))
    {
        AlertDialog.Builder builder = new AlertDialog.Builder(myactivity);
        builder.setMessage("This feature is unavailable as this feature requires permission that you have denied. Please allow " + mypermissions[0] + " from settings to proceed further.")
            .setTitle("Permission Required")
            .setCancelable(false)
            .setNegativeButton("Cancel", (dialog, which) ->
            {
                dialog.dismiss();
            })
            .setPositiveButton("Settings", (dialog, which) ->
            {
                try
                {
                    dialog.dismiss();

                    Intent intent = new Intent();
                    intent.setAction(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
                    Uri uri = Uri.fromParts("package",
                            myactivity.getPackageName(), null);
                    intent.setData(uri);
                    myactivity.startActivity(intent);
                }
                catch (Exception e)
                {
                    dialog.dismiss();

                    Intent intent = new Intent();
                    intent.setAction(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
                    myactivity.startActivity(intent);
                }
                //dialog.dismiss();
            });
        builder.show();
    }

    else
    {
        CheckPermission checkPermission =
                new CheckPermission(mycontext, myactivity);
        checkPermission.askPermissionBox(mypermissions, myrequestCode);
    }
}
}

Of course, I rename all my packages' name and make the variables become public if required by android studio. However, my app still crashes immediately when I launch it in emulator with the error message shown:

FATAL EXCEPTION: main
        Process: com.example.permission, PID: 3291
        java.lang.RuntimeException: Unable to resume activity {com.example.permission/com.example.permission.MainActivity}: java.lang.ArrayIndexOutOfBoundsException: length=0; index=0
            at android.app.ActivityThread.performResumeActivity(ActivityThread.java:4962)
            at android.app.ActivityThread.handleResumeActivity(ActivityThread.java:4995)
            at android.app.servertransaction.TransactionExecutor.performLifecycleSequence(TransactionExecutor.java:229)
            at android.app.servertransaction.TransactionExecutor.cycleToPath(TransactionExecutor.java:205)
            at android.app.servertransaction.TransactionExecutor.executeLifecycleState(TransactionExecutor.java:177)
            at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:98)
            at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2443)
            at android.os.Handler.dispatchMessage(Handler.java:106)
            at android.os.Looper.loopOnce(Looper.java:205)
            at android.os.Looper.loop(Looper.java:294)
            at android.app.ActivityThread.main(ActivityThread.java:8177)
            at java.lang.reflect.Method.invoke(Native Method)
            at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:552)
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:971)
        Caused by: java.lang.ArrayIndexOutOfBoundsException: length=0; index=0
            at com.example.permission.permission.OnPermissionsResult.onPermissionsResult(OnPermissionsResult.java:49)
            at com.example.permission.MainActivity.onRequestPermissionsResult(MainActivity.java:104)
            at android.app.Activity.requestPermissions(Activity.java:5479)
            at androidx.core.app.ActivityCompat$Api23Impl.requestPermissions(ActivityCompat.java:904)
            at androidx.core.app.ActivityCompat.requestPermissions(ActivityCompat.java:545)
            at com.example.permission.permission.CheckPermission.askPermissionBox(CheckPermission.java:171)
            at com.example.permission.MainActivity.onResume(MainActivity.java:125)
            at android.app.Instrumentation.callActivityOnResume(Instrumentation.java:1603)
            at android.app.Activity.performResume(Activity.java:8743)
            at android.app.ActivityThread.performResumeActivity(ActivityThread.java:4952)
            at android.app.ActivityThread.handleResumeActivity(ActivityThread.java:4995) 
            at android.app.servertransaction.TransactionExecutor.performLifecycleSequence(TransactionExecutor.java:229) 
            at android.app.servertransaction.TransactionExecutor.cycleToPath(TransactionExecutor.java:205) 
            at android.app.servertransaction.TransactionExecutor.executeLifecycleState(TransactionExecutor.java:177) 
            at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:98) 
            at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2443) 
            at android.os.Handler.dispatchMessage(Handler.java:106) 
            at android.os.Looper.loopOnce(Looper.java:205) 
            at android.os.Looper.loop(Looper.java:294) 
            at android.app.ActivityThread.main(ActivityThread.java:8177) 
            at java.lang.reflect.Method.invoke(Native Method) 
            at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:552) 
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:971) 

I am very sure I did not change any part of the script. Where is the problem and how shall I fix the problem?

I am writing a new app which requires users to grant permissions. My app finishes and it works smoothly when I put all the java classes, including MainActivity.java inside the same root folder (com.example.permission).

Then, I want to combine my current project with another one. Since the new combination consists of so many java class (more than 10 java classes) and it will be very messy and difficult to manage if I simply put all the java classes inside the same folder, I separate my java classes and categorize them into several groups according to the functions.

This is the original one(only consists of 5 java classes):

And this is what I want to re-anize (and later I want to introduce even more packages):

Here is my MainActivity.java:

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

    @Override
    public void onRequestPermissionsResult(int requestCode,
                                           @NonNull String[] permissions,
                                           @NonNull int[] grantResults)
    {
        super.onRequestPermissionsResult(requestCode, permissions, 
        grantResults);

        OnPermissionsResult onPermissionResult = new 
        OnPermissionsResult(MainActivity.this,MainActivity.this, 
        requestCode,
        permissions, grantResults);

        onPermissionResult.onPermissionsResult();
    }


    @Override
    protected void onStart()
    {
        super.onStart();
    }

    @Override
    protected void onResume()
    {
        super.onResume();

        // Re-check the permission grant when onResume().

        if (ContextCompat.checkSelfPermission(MainActivity.this,
                Manifest.permission.CAMERA) != 
                PackageManager.PERMISSION_GRANTED)
        {
            CheckPermission checkPermission =
                    new CheckPermission(MainActivity.this, 
                    MainActivity.this);
            checkPermission.askPermissionBox(new String[] 
           {PERMISSION_CAMERA}, CAMERA);
        }
    }

Here is my OnPermissionResult.java:

public class OnPermissionsResult
{
private Context mycontext;
private Activity myactivity;
private int[] mygrandResults;
private String[] mypermissions;
private int myrequestCode;
int permissionChecker = PackageManager.PERMISSION_GRANTED;


public OnPermissionsResult(Context context, Activity activity, int requestCode,
                           @NonNull String[] permissions, @NonNull int[] grantResults)
{
    this.myactivity = activity;
    this.mycontext = context;
    this.mygrandResults = grantResults;
    this.mypermissions = permissions;
    this.myrequestCode = requestCode;
}

public void onPermissionsResult()
{
    for (int permission: mygrandResults)
    {
        permissionChecker = permissionChecker + permission;
    }

    if (permissionChecker == PackageManager.PERMISSION_GRANTED &&
        mygrandResults.length > 0)
    {
        OnPermissionGranted onPermissionGranted =
            new OnPermissionGranted(myrequestCode, mycontext, myactivity);
        onPermissionGranted.skip_to_next_permission(myrequestCode, myactivity);
    }

    else if (!ActivityCompat.shouldShowRequestPermissionRationale
            (myactivity, mypermissions[0]))
    {
        AlertDialog.Builder builder = new AlertDialog.Builder(myactivity);
        builder.setMessage("This feature is unavailable as this feature requires permission that you have denied. Please allow " + mypermissions[0] + " from settings to proceed further.")
            .setTitle("Permission Required")
            .setCancelable(false)
            .setNegativeButton("Cancel", (dialog, which) ->
            {
                dialog.dismiss();
            })
            .setPositiveButton("Settings", (dialog, which) ->
            {
                try
                {
                    dialog.dismiss();

                    Intent intent = new Intent();
                    intent.setAction(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
                    Uri uri = Uri.fromParts("package",
                            myactivity.getPackageName(), null);
                    intent.setData(uri);
                    myactivity.startActivity(intent);
                }
                catch (Exception e)
                {
                    dialog.dismiss();

                    Intent intent = new Intent();
                    intent.setAction(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
                    myactivity.startActivity(intent);
                }
                //dialog.dismiss();
            });
        builder.show();
    }

    else
    {
        CheckPermission checkPermission =
                new CheckPermission(mycontext, myactivity);
        checkPermission.askPermissionBox(mypermissions, myrequestCode);
    }
}
}

Of course, I rename all my packages' name and make the variables become public if required by android studio. However, my app still crashes immediately when I launch it in emulator with the error message shown:

FATAL EXCEPTION: main
        Process: com.example.permission, PID: 3291
        java.lang.RuntimeException: Unable to resume activity {com.example.permission/com.example.permission.MainActivity}: java.lang.ArrayIndexOutOfBoundsException: length=0; index=0
            at android.app.ActivityThread.performResumeActivity(ActivityThread.java:4962)
            at android.app.ActivityThread.handleResumeActivity(ActivityThread.java:4995)
            at android.app.servertransaction.TransactionExecutor.performLifecycleSequence(TransactionExecutor.java:229)
            at android.app.servertransaction.TransactionExecutor.cycleToPath(TransactionExecutor.java:205)
            at android.app.servertransaction.TransactionExecutor.executeLifecycleState(TransactionExecutor.java:177)
            at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:98)
            at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2443)
            at android.os.Handler.dispatchMessage(Handler.java:106)
            at android.os.Looper.loopOnce(Looper.java:205)
            at android.os.Looper.loop(Looper.java:294)
            at android.app.ActivityThread.main(ActivityThread.java:8177)
            at java.lang.reflect.Method.invoke(Native Method)
            at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:552)
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:971)
        Caused by: java.lang.ArrayIndexOutOfBoundsException: length=0; index=0
            at com.example.permission.permission.OnPermissionsResult.onPermissionsResult(OnPermissionsResult.java:49)
            at com.example.permission.MainActivity.onRequestPermissionsResult(MainActivity.java:104)
            at android.app.Activity.requestPermissions(Activity.java:5479)
            at androidx.core.app.ActivityCompat$Api23Impl.requestPermissions(ActivityCompat.java:904)
            at androidx.core.app.ActivityCompat.requestPermissions(ActivityCompat.java:545)
            at com.example.permission.permission.CheckPermission.askPermissionBox(CheckPermission.java:171)
            at com.example.permission.MainActivity.onResume(MainActivity.java:125)
            at android.app.Instrumentation.callActivityOnResume(Instrumentation.java:1603)
            at android.app.Activity.performResume(Activity.java:8743)
            at android.app.ActivityThread.performResumeActivity(ActivityThread.java:4952)
            at android.app.ActivityThread.handleResumeActivity(ActivityThread.java:4995) 
            at android.app.servertransaction.TransactionExecutor.performLifecycleSequence(TransactionExecutor.java:229) 
            at android.app.servertransaction.TransactionExecutor.cycleToPath(TransactionExecutor.java:205) 
            at android.app.servertransaction.TransactionExecutor.executeLifecycleState(TransactionExecutor.java:177) 
            at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:98) 
            at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2443) 
            at android.os.Handler.dispatchMessage(Handler.java:106) 
            at android.os.Looper.loopOnce(Looper.java:205) 
            at android.os.Looper.loop(Looper.java:294) 
            at android.app.ActivityThread.main(ActivityThread.java:8177) 
            at java.lang.reflect.Method.invoke(Native Method) 
            at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:552) 
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:971) 

I am very sure I did not change any part of the script. Where is the problem and how shall I fix the problem?

Share Improve this question edited Nov 29, 2024 at 9:57 marc_s 756k184 gold badges1.4k silver badges1.5k bronze badges asked Nov 20, 2024 at 1:13 Lo DennisLo Dennis 335 bronze badges 2
  • The error log shows the ArrayIndex is out of bound and it occurs inside your OnPermissionResule class. Can you share the OnPermissionsResult.java code – Ravinder Bhandari Commented Nov 20, 2024 at 2:01
  • Editted just now. – Lo Dennis Commented Nov 20, 2024 at 2:19
Add a comment  | 

1 Answer 1

Reset to default 0

ArrayIndexOutOfBound exception occurs when you try to access mypermissions[0] without checking the array's length.

Update your else if statement like this:

else if (mypermissions.length > 0 &&
         !ActivityCompat.shouldShowRequestPermissionRationale(myactivity, mypermissions[0]))
{
     //Your code goes here
}

Now, you might have to further debug why you are getting an empty permissions array in your activity's onRequestPermissionsResult() method. This could happen if the user dismisses the permission dialog (e.g., by tapping outside or pressing the back button), in such case the permissions and grantResults arrays can be empty.

发布者:admin,转转请注明出处:http://www.yc00.com/questions/1742387295a4434314.html

相关推荐

发表回复

评论列表(0条)

  • 暂无评论

联系我们

400-800-8888

在线咨询: QQ交谈

邮件:admin@example.com

工作时间:周一至周五,9:30-18:30,节假日休息

关注微信