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

Android权限请求异常:权限弹窗未显示问题求助

Android权限请求对话框不弹出的问题解决

嘿,别担心,这确实是新手开发Android时很容易踩的小坑,咱们一步步把它搞定!

问题根源梳理

我看了你的代码,发现几个关键问题导致权限请求对话框没弹出来:

  • 重复调用权限请求被覆盖:你连续调用了两次ActivityCompat.requestPermissions,Android系统只会处理最后一次的请求,所以第一次申请READ_EXTERNAL_STORAGE的请求被直接忽略了,自然不会弹出对应的权限对话框。
  • INTERNET权限无需动态申请:INTERNET属于Android的「普通权限」,只要在AndroidManifest.xml里声明了,系统就会自动授予,完全不需要通过requestPermissions去动态申请,这一步是多余的操作。
  • 权限回调逻辑搞反了:你的onRequestPermissionsResult方法里,当权限被成功授予时,居然显示"Permission denied",这会误导你判断权限的实际状态。

修正后的代码

下面是调整后的完整代码,我已经修复了上述所有问题:

public class MainActivity extends AppCompatActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        requestWindowFeature(Window.FEATURE_NO_TITLE);
        getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);
        setContentView(R.layout.activity_main);

        // 仅动态申请需要的危险权限:READ_EXTERNAL_STORAGE
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
            ActivityCompat.requestPermissions(
                MainActivity.this,
                new String[]{Manifest.permission.READ_EXTERNAL_STORAGE},
                1
            );
        }
    }

    public void Upload() {
        TextView Result = (TextView) findViewById(R.id.Conn);
        String URL = ((EditText) findViewById(R.id.URL)).getText().toString();
        String Username = ((EditText) findViewById(R.id.Username)).getText().toString();
        String Password = ((EditText) findViewById(R.id.Password)).getText().toString();

        FTPClient FTPClient = new FTPClient();
        FTPClient.enterLocalPassiveMode();

        try {
            InetAddress indirizzo = InetAddress.getByName(URL);
            FTPClient.connect(indirizzo);
            Result.setText(FTPClient.getReplyString());

            // 登录服务器
            boolean login = FTPClient.login(Username, Password);
            if (login) {
                Result.append(" ..login effettuato");
            } else {
                Result.append("...login fallito");
            }

            // 以下是你注释的上传逻辑,我保留了原结构
            /*
            client.setFileType(FTP.BINARY_FILE_TYPE);
            File sdcardDir = Environment.getExternalStorageDirectory();
            File file = new File(sdcardDir, "fotografia.jpeg");
            FileInputStream fis = new FileInputStream(file);
            boolean upload_ok = client.storeFile("fotografia.jpeg", fis);
            fis.close();
            if(upload_ok==true)risposta.append(" ..... upload ok");
            else risposta.append("....upload fallito, errore: " + upload_ok);
            */
        } catch (SocketException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    @Override
    public void onRequestPermissionsResult(int requestCode, String permissions[], int[] grantResults) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);
        switch (requestCode) {
            case 1: {
                // 判断请求是否被取消,以及权限是否被授予
                if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                    // 权限授予成功
                    Toast.makeText(MainActivity.this, "Permission granted", Toast.LENGTH_SHORT).show();
                } else {
                    // 权限被拒绝
                    Toast.makeText(MainActivity.this, "Permission denied", Toast.LENGTH_SHORT).show();
                }
                return;
            }
        }
    }
}

额外注意事项

  1. 确保你在AndroidManifest.xml里已经正确声明了权限:
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
  1. 如果你的App目标SDK是Android 10(API 29)及以上,读取外部存储还需要适配分区存储机制,或者在Manifest里添加android:requestLegacyExternalStorage="true"(仅临时兼容),不过这是后续的适配问题,先解决当前权限对话框弹出的问题就好。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 09:30:23