问题描述
我正在将手机用作android studio中的模拟器。我遇到错误“ /0/personalist.xml ”没有这样的文件或目录,我多次检查了我的代码,并且在和认为错误与许可有关。如果我将手机用作存储设备,是否应该申请 WRITE_EXTERNAL_STORAGE 许可?
package com.mehMetaltindal.artbook;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.app.ActivityCompat;
import androidx.core.content.ContextCompat;
import android.Manifest;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.database.sqlite.sqliteDatabase;
import android.database.sqlite.sqliteStatement;
import android.graphics.Bitmap;
import android.graphics.imagedecoder;
import android.net.Uri;
import android.os.Build;
import android.os.Bundle;
import android.provider.MediaStore;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ImageView;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
public class ArtsActivity extends AppCompatActivity {
EditText editTextArtName;
EditText editTextYear;
EditText editTextPainter;
Bitmap selectedImage;
ImageView imageViewArt;
Button button;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_arts);
imageViewArt = findViewById(R.id.imageViewArt);
editTextArtName = findViewById(R.id.editTextArtName);
editTextPainter = findViewById(R.id.editTextPainterName);
editTextYear = findViewById(R.id.editTextYear);
button = findViewById(R.id.button);
}
public void selectimage(View view) {
if (ContextCompat.checkSelfPermission(this,Manifest.permission.READ_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) {
ActivityCompat.requestPermissions(this,new String[]{Manifest.permission.READ_EXTERNAL_STORAGE},1);
} else {
Intent intentTogallery = new Intent(Intent.ACTION_PICK,MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
startActivityForResult(intentTogallery,2);
}
}
@Override
public void onRequestPermissionsResult(int requestCode,@NonNull String[] permissions,@NonNull int[] grantResults) {
if (requestCode==1){
if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED){
Intent intentTogallery = new Intent(Intent.ACTION_PICK,MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
startActivityForResult(intentTogallery,2);
}
}
super.onRequestPermissionsResult(requestCode,permissions,grantResults);
}
@Override
protected void onActivityResult(int requestCode,int resultCode,@Nullable Intent data) {
if (requestCode == 2 && resultCode == RESULT_OK && data != null)
{
Uri imageData = data.getData();
try {
if (Build.VERSION.SDK_INT >= 28){
imagedecoder.source source = imagedecoder.createSource(this.getContentResolver(),imageData); //Content resolver kullanarak Uri'ı alıp bitmapa çevirmek için kullanılır.
selectedImage = imagedecoder.decodeBitmap(source);
}else {
selectedImage = MediaStore.Images.Media.getBitmap(this.getContentResolver(),imageData);
imageViewArt.setimageBitmap(selectedImage);
}
} catch (IOException e) {
e.printstacktrace();
}
}
super.onActivityResult(requestCode,resultCode,data);
}
public void save (View view){
String artsName = editTextArtName.getText().toString();
String painterName = editTextPainter.getText().toString();
String year = editTextYear.getText().toString();
Bitmap smallImage = makeSmaller(selectedImage,300);
ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
smallImage.compress(Bitmap.CompressFormat.PNG,50,outputStream);
byte[] byteArray = outputStream.toByteArray();
try {
sqliteDatabase myDatabase = this.openorCreateDatabase("Arts",MODE_PRIVATE,null);
myDatabase.execsql("CREATE TABLE IF NOT EXISTS arts (id VARCHAR,artname VARCHAR,paintername VARCHAR,year VARCHAR,image BLOB)");
String sqlString ="INSERT INTO arts (artname,painter,year,image) VALUES (?,?,?)";
sqliteStatement sqliteStatement = myDatabase.compileStatement(sqlString);
sqliteStatement.bindString(1,artsName);
sqliteStatement.bindString(2,painterName);
sqliteStatement.bindString(3,year);
sqliteStatement.bindBlob(4,byteArray);
sqliteStatement.execute();
} catch (Exception e){
}
finish();
}
public Bitmap makeSmaller (Bitmap image,int maxSize){
int width = image.getWidth();
int height = image.getHeight();
float bitMapRatio = (float) width / (float)height;
if (bitMapRatio > 1){
width = maxSize;
height = (int) (width / bitMapRatio);
}else{
height = maxSize;
width = (int) (height * bitMapRatio);
}
return Bitmap.createScaledBitmap(image,width,height,true); //bitmapi tekrar yeni ölçülerle yeni bir bitmap'e çevirmek için metod
}
}
我想知道我是否可以在 selectimage 代码块中应用足够的权限?
解决方法
尝试以下代码:
@RequiresApi(api = Build.VERSION_CODES.JELLY_BEAN)
public void readStoragePermission() {
int checkpermissions = ContextCompat.checkSelfPermission(SplaceScreenActivity.this,Manifest.permission.READ_EXTERNAL_STORAGE);
String[] permissions = {Manifest.permission.READ_EXTERNAL_STORAGE};
boolean status = isGranted(checkpermissions);
if (status) {
wirteStoragePermission();
} else {
ActivityCompat.requestPermissions(SplaceScreenActivity.this,permissions,001);
}
}
public void wirteStoragePermission() {
int checkpermissions = ContextCompat.checkSelfPermission(SplaceScreenActivity.this,Manifest.permission.WRITE_EXTERNAL_STORAGE);
String[] permissions = {Manifest.permission.WRITE_EXTERNAL_STORAGE};
boolean status = isGranted(checkpermissions);
if (status) {
audioStoragePermission();
} else {
ActivityCompat.requestPermissions(SplaceScreenActivity.this,002);
}
}
public void audioStoragePermission() {
int checkpermissions = ContextCompat.checkSelfPermission(SplaceScreenActivity.this,Manifest.permission.RECORD_AUDIO);
String[] permissions = {Manifest.permission.RECORD_AUDIO};
boolean status = isGranted(checkpermissions);
if (status) {
phoneStoragePermission();
} else {
ActivityCompat.requestPermissions(SplaceScreenActivity.this,003);
}
}
public void phoneStoragePermission() {
int checkpermissions = ContextCompat.checkSelfPermission(SplaceScreenActivity.this,Manifest.permission.READ_PHONE_STATE);
String[] permissions = {Manifest.permission.READ_PHONE_STATE};
boolean status = isGranted(checkpermissions);
if (status) {
next();
} else {
ActivityCompat.requestPermissions(SplaceScreenActivity.this,004);
}
}
private boolean isGranted(int permission) {
if (permission == PackageManager.PERMISSION_GRANTED) {
return true;
} else {
return false;
}
}
public void next() {
handler = new Handler();
handler.postDelayed(new Runnable() {
@Override
public void run() {
Intent intent = new Intent(SplaceScreenActivity.this,MainActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK | Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);
}
},2000);
}
@RequiresApi(api = Build.VERSION_CODES.JELLY_BEAN)
@Override
public void onRequestPermissionsResult(int requestCode,@NonNull String[] permissions,@NonNull int[] grantResults) {
if (requestCode == 001) {
if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
wirteStoragePermission();
} else {
Toast.makeText(this,"Without STORAGE PERMISSION EMS not open",Toast.LENGTH_LONG).show();
readStoragePermission();
}
}
if (requestCode == 002) {
if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
audioStoragePermission();
} else {
Toast.makeText(this,Toast.LENGTH_LONG).show();
wirteStoragePermission();
}
}
if (requestCode == 003) {
if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
phoneStoragePermission();
} else {
Toast.makeText(this,"Without AUDIO PERMISSION EMS not open",Toast.LENGTH_LONG).show();
audioStoragePermission();
}
}
if (requestCode == 004) {
if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
next();
} else {
Toast.makeText(this,"Without READ PHONE STATE PERMISSION EMS not open",Toast.LENGTH_LONG).show();
phoneStoragePermission();
}
}
}