android - java.io.IOException:没有这样的文件或目录(保存图像)
问题描述
我将从设备中选择的照片上传到 ftp。但是,尽管我从设备中选择了照片,但我得到了“没有这样的文件目录”错误。尽管我授予应用程序权限,但它不会将其保存到我在应用程序中选择的 IMAGE_DIRECTORY。所以我得到这个错误。即使我授予了权限,它没有保存文件的原因是什么?
错误行: f.createNewFile();
错误代码:
W/System.err: java.io.IOException: No such file or directory
at java.io.UnixFileSystem.createFileExclusively0(Native Method)
at java.io.UnixFileSystem.createFileExclusively(UnixFileSystem.java:317)
at java.io.File.createNewFile(File.java:1008)
at com.example.stechome.ui.hesabim.HesabimFragment.saveImage
分段
public class asdFragment extends Fragment {
private static final String IMAGE_DIRECTORY = "/asdasd";
public static final int REQUEST_ID_MULTIPLE_PERMISSIONS = 1;
private int GALLERY = 1, CAMERA1 = 2;
private boolean checkAndRequestPermissions() {
int permissionACCESS_NETWORK_STATE = ContextCompat.checkSelfPermission(getActivity(), android.Manifest.permission.ACCESS_NETWORK_STATE);
int permissionWRITE_EXTERNAL_STORAGE = ContextCompat.checkSelfPermission(getActivity(), android.Manifest.permission.WRITE_EXTERNAL_STORAGE);
int permissionREAD_EXTERNAL_STORAGE = ContextCompat.checkSelfPermission(getActivity(), android.Manifest.permission.READ_EXTERNAL_STORAGE);
int permissionCAMERA = ContextCompat.checkSelfPermission(getActivity(), android.Manifest.permission.CAMERA);
int permissionACCESS_FINE_LOCATION = ContextCompat.checkSelfPermission(getActivity(), android.Manifest.permission.ACCESS_FINE_LOCATION);
List<String> listPermissionsNeeded = new ArrayList<>();
if (permissionACCESS_NETWORK_STATE != PackageManager.PERMISSION_GRANTED) {
listPermissionsNeeded.add(android.Manifest.permission.ACCESS_NETWORK_STATE);
}
if (permissionWRITE_EXTERNAL_STORAGE != PackageManager.PERMISSION_GRANTED) {
listPermissionsNeeded.add(android.Manifest.permission.WRITE_EXTERNAL_STORAGE);
}
if (permissionREAD_EXTERNAL_STORAGE != PackageManager.PERMISSION_GRANTED) {
listPermissionsNeeded.add(android.Manifest.permission.READ_EXTERNAL_STORAGE);
}
if (permissionCAMERA != PackageManager.PERMISSION_GRANTED) {
listPermissionsNeeded.add(android.Manifest.permission.CAMERA);
}
if (permissionACCESS_FINE_LOCATION != PackageManager.PERMISSION_GRANTED) {
listPermissionsNeeded.add(android.Manifest.permission.ACCESS_FINE_LOCATION);
}
if (!listPermissionsNeeded.isEmpty()) {
ActivityCompat.requestPermissions(getActivity(), listPermissionsNeeded.toArray(new String[listPermissionsNeeded.size()]), REQUEST_ID_MULTIPLE_PERMISSIONS);
return false;
}
return true;
}
public String saveImage(Bitmap myBitmap) {
Random r = new Random();
int min=100000;
int maks=1000000;
int random = r.nextInt((maks-min)+1)+min;
ByteArrayOutputStream bytes = new ByteArrayOutputStream();
myBitmap.compress(Bitmap.CompressFormat.JPEG,100,bytes);
File wallpaperDirectory = new File(
Environment.getExternalStorageDirectory() + IMAGE_DIRECTORY);
// have the object build the directory structure, if needed.
if (!wallpaperDirectory.exists()) {
wallpaperDirectory.mkdirs();
}
try {
File f = new File(wallpaperDirectory, "ProfilFoto"+"foto"+random+".jpg");
f.createNewFile();
////
///resmi kaydetmek localde kaydetmek için
/// sadece galeriden görüntü aldıracağımız için kapatıyoruz.
///
FileOutputStream fo = new FileOutputStream(f);
fo.write(bytes.toByteArray());
MediaScannerConnection.scanFile(getActivity(),
new String[]{f.getPath()},
new String[]{"image/jpeg"}, null);
fo.close();
Log.d("TAG", "File Saved::--->" + f.getAbsolutePath());
// Toast.makeText(this, f.getAbsolutePath(), Toast.LENGTH_SHORT).show();
/*UploadVideo async = new UploadVideo(f.getAbsolutePath());
async.execute();*/
currentimgPath=f.getAbsolutePath();
dosyaAd=f.getName();
SharedPreferences sharedPref = getActivity().getSharedPreferences("sharedPref",Context.MODE_PRIVATE);
SharedPreferences.Editor editor = sharedPref.edit();
editor.putString("dosyaAdProfil", dosyaAd);
System.out.println("dosyaAdProfil" + dosyaAd);
editor.commit();
return f.getAbsolutePath();
} catch (IOException e1) {
e1.printStackTrace();
}
return "";
}
private void showPictureDialog(){
/* AlertDialog.Builder pictureDialog = new AlertDialog.Builder(this);
pictureDialog.setTitle("İşlem Seçiniz");
String[] pictureDialogItems = {
"Galeri'den Seç",
"Kamera'dan Al" };
pictureDialog.setItems(pictureDialogItems,
new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
switch (which) {
case 0:
choosePhotoFromGallary();
break;
case 1:
takePhotoFromCamera();
break;
}
}
});
pictureDialog.show();*/
if (!checkAndRequestPermissions()) {
return;
}
AlertDialog.Builder pictureDialog = new AlertDialog.Builder(getActivity());
pictureDialog.setTitle("İşlem Seçiniz");
String[] pictureDialogItems = {
"Galeri'den Seç"};
pictureDialog.setItems(pictureDialogItems,
new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
switch (which) {
case 0:
choosePhotoFromGallary();
break;
}
}
});
pictureDialog.show();
}
public void choosePhotoFromGallary() {
Intent galleryIntent = new Intent(Intent.ACTION_PICK,
android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
startActivityForResult(galleryIntent, GALLERY);
}
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (resultCode == getActivity().RESULT_CANCELED) {
return;
}
if (requestCode == GALLERY) {
if (data != null) {
Uri contentURI = data.getData();
try {
Bitmap bitmap = MediaStore.Images.Media.getBitmap(getActivity().getContentResolver(), contentURI);
// String path = saveImage(bitmap);
// String pth=contentURI.getPath();
imageview.setImageBitmap(bitmap);
filept=getRealPathFromURI(contentURI);
//Toast.makeText(this, filept, Toast.LENGTH_SHORT).show();
saveImage(bitmap);
} catch (IOException e) {
e.printStackTrace();
Toast.makeText(getActivity(), "İşlem Başarısız!", Toast.LENGTH_SHORT).show();
}
}
} else if (requestCode == CAMERA1) {
Bitmap thumbnail = (Bitmap) data.getExtras().get("data");
imageview.setImageBitmap(thumbnail);
saveImage(thumbnail);
Toast.makeText(getActivity(), "Görüntü Seçildi!", Toast.LENGTH_SHORT).show();
}
}
public String getRealPathFromURI(Uri contentUri) {
// can post image
String [] proj={MediaStore.Images.Media.DATA};
Cursor cursor = getActivity().managedQuery( contentUri,
proj, // Which columns to return
null, // WHERE clause; which rows to return (all rows)
null, // WHERE clause selection arguments (none)
null); // Order-by clause (ascending by name)
int column_index = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
cursor.moveToFirst();
return cursor.getString(column_index);
}
private void takePhotoFromCamera() {
Intent intent = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE);
startActivityForResult(intent, CAMERA1);
// dispatchTakePictureIntent();
}
解决方案
将此添加到应用程序标记中的清单 android:requestLegacyExternalStorage="true"
推荐阅读
- javascript - 未捕获的 TypeError:timer.getTime 不是更新时的函数
- r - Revealjs中的R传单
- typescript - 如何在 Deno 中制作图形应用程序?
- google-analytics - 谷歌分析“在交易中进入的会话”
- java - 如何通过注释访问 JavaFX 字段?
- mysql - 在shell中使用变量的mysql脚本
- python - Jupyter Notebook - 协议:找不到命令
- python - 字符串中的 Pyspark 双字符替换避免某些单词而不映射到 pandas 或 rdd
- javascript - 从@ant-design 中删除未使用的 javascript
- powerapps - Powerapps 库显示 2 个共享点列表