我正在开发一个小型应用程序项目,该项目调用camera.app,拍摄照片并在屏幕上返回照片。当照片是局部变量时,我可以完成所有步骤。但是,当我想将其保存在特定路径中并从路径中读取时,Android始终会发出警告
Welcome good morning
Validate {username} and {password}
Report generate my report
还有一些我不理解的警告,例如
'E/BitmapFactory: Unable to decode stream: java.io.FileNotFoundException: /storage/emulated/0/camera_app/cam_image.jpg: open failed: ENOENT (No such file or directory)'
计算机可以读取SD卡。我不知道如何调试代码
E/linker: readlink('/proc/self/fd/42') failed: Permission denied [fd=42]
E/HiApp.SerializedObject: Thread-840{840} a.b(null:-1) <<< ERROR >>> read file error/storage/emulated/0/Android/data/com.huawei.appmarket/files/Data/.AppCheckInfo: open failed: ENOENT (No such file or directory)
更新了xml:
Button button;
ImageView imageView;
static final int CAM_REQUEST = 1;
String SDPath = Environment.getExternalStorageDirectory().getAbsolutePath();
TextView SDCard;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
button = (Button) findViewById(R.id.bn);
imageView = (ImageView) findViewById(R.id.img);
SDCard = (TextView)findViewById(R.id.sdcard);
SDCard.setText(SDPath);
button.setOnClickListener(new View.OnClickListener(){
public void onClick(View v){
Intent camera_intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
File file = getFile();
Uri contentUri = Uri.fromFile(file);
camera_intent.putExtra(MediaStore.EXTRA_OUTPUT,contentUri);
startActivityForResult(camera_intent,CAM_REQUEST);
}});
}
private File getFile(){
File folder = new File(SDPath+"/camera_app");//"EVA-AL10/sdcard/camera_app" "storage/1599-2841/camera_app"
if(!folder.exists()){
folder.mkdir();
}
File image_file = new File(folder,"cam_image.jpg");
return image_file;
}
protected void onActivityResult(int requestCode, int resultCode, Intent data){
String path = SDPath+"/camera_app/cam_image.jpg";//"EVA-AL10/sdcard/camera_app/cam_image.jpg"
imageView.setImageDrawable(Drawable.createFromPath(path));
}
答案 0 :(得分:0)
我认为你错过了一项权限:READ_EXTERNAL_STORAGE
答案 1 :(得分:0)
检查您的清单文件。
您需要添加这两个权限
READ_EXTERNAL_STORAGE
WRITE_EXTERNAL_STORAGE
答案 2 :(得分:0)
如果您的目标是api 23+,那么您应该添加运行时权限检查。在您的第一个启动活动中,您需要添加此代码
@Override
protected void onResume() {
super.onResume();
if (Build.VERSION.SDK_INT >= 23){
checkAllPermissions();
}
}
这是方法检查所有权限
private void checkAllPermissions() {
if (ContextCompat.checkSelfPermission(mActivity, Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) {
ActivityCompat.requestPermissions(mActivity, new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE},
MY_PERMISSIONS_REQUEST_STORAGE);
Log.d(TAG, "checkAllPermissions: inside write external");
}
if (ContextCompat.checkSelfPermission(mActivity, Manifest.permission.READ_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) {
ActivityCompat.requestPermissions(mActivity, new String[]{Manifest.permission.READ_EXTERNAL_STORAGE},
MY_PERMISSIONS_REQUEST_STORAGE);
Log.d(TAG, "checkAllPermissions: inside read external");
}}
希望这会对你有所帮助。