You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Android 13应用卡在启动页无崩溃,低版本正常(附代码)

问题分析与修复方案

核心问题1:权限判断逻辑完全颠倒

你的代码中权限判断逻辑写反了:

  • 当前逻辑是已拥有权限时请求权限,无权限时直接跳转,这完全违背了权限申请的正常流程。
  • 正确逻辑应该是无权限时发起请求,已拥有权限时直接进入首页。
    这直接导致Android 13下因权限适配问题,代码陷入错误分支,既不弹出权限请求也不跳转页面。

核心问题2:Android 13(API 33)存储权限适配错误

Android 13开始,READ_EXTERNAL_STORAGE和WRITE_EXTERNAL_STORAGE已被废弃,系统会忽略这两个权限的申请请求。若应用targetSdkVersion >=33,需使用细分媒体权限(如READ_MEDIA_IMAGES、READ_MEDIA_VIDEO等)替代旧存储权限。同时POST_NOTIFICATIONS权限需在Manifest中声明,否则请求会被系统忽略。

核心问题3:权限请求与回调使用了不一致的权限数组

你在onCreate中定义了permissionsList,但请求权限时用了Utils.permissions,回调中又校验permissionsList,这会导致权限校验逻辑混乱。


修复后的完整代码

public class SplashScreen extends AppCompatActivity {

    String[] permissionsList;

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

        // 适配Android 13及以上权限
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) {
            // 根据业务需求替换为对应媒体权限,示例为图片权限
            permissionsList = new String[]{
                    Manifest.permission.READ_MEDIA_IMAGES,
                    Manifest.permission.POST_NOTIFICATIONS
            };
        } else {
            permissionsList = new String[]{
                    Manifest.permission.READ_EXTERNAL_STORAGE,
                    Manifest.permission.WRITE_EXTERNAL_STORAGE
            };
        }

        ((RubberLoaderView) findViewById(R.id.loader1)).startLoading();
        
        // 修正逻辑:无权限时才发起请求
        if (!Utils.hasPermissions(this, permissionsList)) {
            ActivityCompat.requestPermissions(this, permissionsList, Utils.perRequest);
        } else {
            gotoNext();
        }
    }

    @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);
        if (requestCode == Utils.perRequest) {
            // 检查所有权限是否都已授予
            boolean allGranted = true;
            for (int result : grantResults) {
                if (result != PackageManager.PERMISSION_GRANTED) {
                    allGranted = false;
                    break;
                }
            }
            
            if (allGranted) {
                gotoNext();
            } else {
                // 可根据业务需求提示用户权限未获取,或直接跳转
                gotoNext();
            }
        }
    }

    void gotoNext() {
        new Handler().postDelayed(() -> {
            startActivity(new Intent(SplashScreen.this, Home.class).addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP));
            finish();
        }, 600);
    }
}

额外注意事项

  1. 确保在AndroidManifest.xml中声明对应权限:
    <!-- Android 13及以上媒体权限 -->
    <uses-permission android:name="android.permission.READ_MEDIA_IMAGES" />
    <uses-permission android:name="android.permission.POST_NOTIFICATIONS" />
    <!-- 低版本存储权限 -->
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" android:maxSdkVersion="32" />
    
  2. 确认Utils.hasPermissions方法实现正确,需校验传入的所有权限是否都已被授予:
    public static boolean hasPermissions(Context context, String[] permissions) {
        for (String permission : permissions) {
            if (ContextCompat.checkSelfPermission(context, permission) != PackageManager.PERMISSION_GRANTED) {
                return false;
            }
        }
        return true;
    }
    

内容的提问来源于stack exchange,提问作者Garvit

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.07 04:15:52