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
1 Answer
Reset to default 0ArrayIndexOutOfBound 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条)