找不到文件异常:java.io.FileNotFoundException:/storage/emulated/0/FolderName/subFolderName/my_image.jpg:open failed:ENOENT(没有这样的文件或目录)
我仅在部分手机中超越异常
保存从相机捕获的图像时,我发现文件未找到异常。 这是我的代码
我正在捕捉图片:
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data){
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == 0)
{
if(data!=null)
{
Bundle extras = data.getExtras();
if (extras != null)
if (img1) {
imgAdd1.setVisibility(View.GONE);
Bitmap thumbnail_1 = (Bitmap) extras.get("data");
Bitmap resized = scaleBitmap(thumbnail_1) ;
selectedImage1 = data.getData() ;
//Bitmap thumbnail_1 = (Bitmap) data.getExtras().get("data");
image1.setVisibility(View.VISIBLE);
image1.setImageBitmap(thumbnail_1);
imageTag = 1 ;
saveImage(resized, (int) System.currentTimeMillis());
img1 = false ;
imgDelete1.setVisibility(View.VISIBLE);
}
}}
在onActivityResult中:
public void saveImage(Bitmap bitmap, int i){
try {
String stored = null;
File sdCard = Environment.getExternalStorageDirectory();
File file = new File(sdCard, "/GMC/Images"
+ File.separator + user_id + "_" + imageTag + ".jpg");
if (file.exists()) {
file.delete();
}
if (isWriteStorageAllowed()) {
if ( isReadStorageAllowed())
//file.createNewFile();
try {
FileOutputStream out = new FileOutputStream(file);//getting exception at this line
bitmap.compress(Bitmap.CompressFormat.PNG, 90, out);
out.flush();
out.close();
stored = "success";
} catch (Exception e) {
e.printStackTrace();
}
if (imageTag == 1) {
selectedImagePath1 = Environment.getExternalStorageDirectory() + "/GMC/Images"
+ File.separator + user_id + "_" + imageTag + ".jpg";
}
}
else {
requestWriteStoragePermission();
requestStoragePermission();
}
}
catch (Exception e)
{
e.printStackTrace();
}
我保存图像的功能是:
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.CAMERA">
已在清单中添加了权限,如
//We are calling this method to check the permission status
private boolean isReadStorageAllowed() {
//Getting the permission status
int result = ContextCompat.checkSelfPermission(context, Manifest.permission.READ_EXTERNAL_STORAGE);
//If permission is granted returning true
if (result == PackageManager.PERMISSION_GRANTED)
return true;
else {
//If permission is not granted returning false
return false;}
}
private boolean isWriteStorageAllowed() {
//Getting the permission status
int result = ContextCompat.checkSelfPermission(context, Manifest.permission.WRITE_EXTERNAL_STORAGE);
//If permission is granted returning true
if (result == PackageManager.PERMISSION_GRANTED)
return true;
else {
//If permission is not granted returning false
return false;}
}
//Requesting permission
private void requestStoragePermission(){
if (ActivityCompat.shouldShowRequestPermissionRationale(getActivity(),Manifest.permission.READ_EXTERNAL_STORAGE)){
//If the user has denied the permission previously your code will come to this block
//Here you can explain why you need this permission
//Explain here why you need this permission
}
//And finally ask for the permission
ActivityCompat.requestPermissions(getActivity(),new String[]{Manifest.permission.READ_EXTERNAL_STORAGE},PERMISSION_READ_EXTERNAL_STORAGE);
}
//Requesting permission
private void requestWriteStoragePermission(){
if (ActivityCompat.shouldShowRequestPermissionRationale(getActivity(),Manifest.permission.WRITE_EXTERNAL_STORAGE)){
//If the user has denied the permission previously your code will come to this block
//Here you can explain why you need this permission
//Explain here why you need this permission
}
//And finally ask for the permission
ActivityCompat.requestPermissions(getActivity(),new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE},PERMISSION_WRITE_EXTERNAL_STORAGE);
}
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
{
switch (requestCode){
case PERMISSION_READ_EXTERNAL_STORAGE :
// If request is cancelled, the result arrays are empty.
if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED){
Toast.makeText(context , "Read Permission granted",Toast.LENGTH_SHORT).show();
}
else {
Toast.makeText(context , "Read Permission Denied" ,Toast.LENGTH_SHORT).show();
}
return;
case PERMISSION_WRITE_EXTERNAL_STORAGE :
if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED){
Toast.makeText(context , "Write Permission granted" ,Toast.LENGTH_SHORT).show();
}
else {
Toast.makeText(context , "write Permission Denied",Toast.LENGTH_SHORT).show();
}
return;
}
}
}
还检查了运行时权限:
import socket
UDP_IP = "192.168.1.2" #IP of the sender
UDP_PORT = 5005
sock = socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
sock.bind((UDP_IP,UDP_PORT))
while True:
data, addr = sock.recvfrom(1024)
print "MSG:" + data
我在两个不同的手机上测试了代码,一个是联想(Marshmallow),另一个是三星(棉花糖),但它在三星中给出了错误,因为它在联想上完美运行。
会出现什么问题? 请帮忙
答案 0 :(得分:0)
尝试在清单文件中添加largeheap=true
。联想手机无法获取大图像,而三星手机则可以从图库相机中获取大图像。