最近需要在安卓上用app跑一些实验,就开始学习安卓开发,过程中在访问图片时报了Permission denied。这是因为在安卓6.0(对应API级别为23)及以上版本中,对危险权限引入了运行时权限管理,不能直接通过在 AndroidManifest.xml 中声明获得这些权限。
正文
首先,添加权限到AndroidManifest.xml中
首先,跟很多别的方法一样,要在 AndroidManifest.xml 中先声明需要的权限:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.helloworld">
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
<application
android:requestLegacyExternalStorage="true"
<activity
...>
...
</activity>
</application>
</manifest>
添加上 <uses-permission> ,还要在<application> 中添加上android:requestLegacyExternalStorage="true"
其次,运行时权限获取
假设要实现一个简单功能,就是点击按钮之后输出读取的图片尺寸。 主要注意一下onClick中的部分。
第一部分
public class FirstActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.first_layout);
Log.d("class info", this.toString());
Log.d("class name", getClass().getSimpleName());
Button button = findViewById(R.id.button1);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
if(ContextCompat.checkSelfPermission(FirstActivity.this, Manifest.permission.READ_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED){
ActivityCompat.requestPermissions(FirstActivity.this, new String[]{Manifest.permission.READ_EXTERNAL_STORAGE}, 1);
}
else {
readTest();
}
}
});
}
}
第二部分
还要重写onRequestPermissionsResult() 函数:
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
if(requestCode == 1){
if(grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED){
readTest();
}
}
else {
Toast.makeText(FirstActivity.this, "you denied.", Toast.LENGTH_SHORT).show();
}
}
附自己的简单函数
我们要实现的简单功能的函数为:
protected void readTest(){
try{
File externalStorage = Environment.getExternalStorageDirectory();
String picturePath = externalStorage.getPath() + "/1.jpg";
Bitmap bitmap = BitmapFactory.decodeFile(picturePath);
Toast.makeText(FirstActivity.this, "读取成功,图片size为 " + bitmap.getWidth() + "x" + bitmap.getHeight(), Toast.LENGTH_LONG).show();
} catch (Exception e){
Toast.makeText(FirstActivity.this, "读取失败", Toast.LENGTH_SHORT).show();
e.printStackTrace();
}
}
成功结果如下
参考
请求应用权限 | android开发者
|