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; } } } }
额外注意事项
- 确保你在
AndroidManifest.xml里已经正确声明了权限:
<uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
- 如果你的App目标SDK是Android 10(API 29)及以上,读取外部存储还需要适配分区存储机制,或者在Manifest里添加
android:requestLegacyExternalStorage="true"(仅临时兼容),不过这是后续的适配问题,先解决当前权限对话框弹出的问题就好。
内容的提问来源于stack exchange,提问作者Bios X
相关产品推荐
相关产品推荐

