赞
踩
最近需要在安卓上用app跑一些实验,就开始学习安卓开发,过程中在访问图片时报了Permission denied。这是因为在安卓6.0(对应API级别为23)及以上版本中,对危险权限引入了运行时权限管理,不能直接通过在 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(); } // Bitmap bitmap = BitmapFactory.decodeFile("/") } }); } }
还要重写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, bitmap.toString(), Toast.LENGTH_LONG).show();
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();
}
}
赞
踩
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。