Android文件未找到例外,但图片已保存

时间:2018-04-29 00:26:37

标签: android

问题的关键在于我正在制作一款利用相机的应用程序,并且能够拍照以在其上使用简单的图像识别API。我可以使用画廊上传图像,但直接从相机给我大量的问题。我基本上只是为大多数图像创建复制了android dev文档,尽管可能需要在这里和那里更改一些项目。这是总代码。

private File createImageFile() throws IOException {
    // Create an image file name
    String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss").format(new Date());
    String imageFileName = "JPEG_" + "Image_for_Stack" + "_";
    File storageDir = new File(Environment.getExternalStoragePublicDirectory(
            Environment.DIRECTORY_DCIM), "Camera");
    File image = File.createTempFile(
            imageFileName,  /* prefix */
            ".jpg",   /* suffix */
            storageDir      /* directory */
    );

    // Save a file: path for use with ACTION_VIEW intents
    currentPhotoPath = "file: " + image.getAbsolutePath();
    return image;
}

private void dispatchTakePictureIntent() {
    try {
        Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
        // Ensure that there's a camera activity to handle the intent
        if (takePictureIntent.resolveActivity(getActivity().getPackageManager()) != null) {
            // Create the File where the photo should go
            File photoFile = null;
            try {
                photoFile = createImageFile();
            } catch (IOException ex) {
                Log.v(TAG, "IO Exception " + ex);
            }
            // Continue only if the File was successfully created
            if (photoFile != null) {
                photoURI = FileProvider.getUriForFile(getContextOfApplication(),
                BuildConfig.APPLICATION_ID + ".provider",
                photoFile);
                takePictureIntent.putExtra(MediaStore.EXTRA_OUTPUT, photoURI);
                startActivityForResult(takePictureIntent, IMAGE_CAPTURE);
            }
        }
    } catch (Exception e) {
        Log.v(TAG, "Exception in dispatch " + e);
    }
}

private void galleryAddPic() {
    try {
        Intent mediaScanIntent = new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE);
        File f = new File(currentPhotoPath);
        Uri contentUri = Uri.fromFile(f);
        mediaScanIntent.setData(contentUri);
        getContextOfApplication().sendBroadcast(mediaScanIntent);
    } catch (Exception e) {
        Log.v(TAG, "Exception " + e);
    }
}

在另一个类中,这称为:

public static byte[] getByteArrayFromIntentData(@NonNull Context context, @NonNull Intent data) {
    InputStream inStream = null;
    Bitmap bitmap = null;
    try {
        inStream = context.getContentResolver().openInputStream(data.getData());
        Log.v(TAG, "Instream works");
        bitmap = BitmapFactory.decodeStream(inStream);
        final ByteArrayOutputStream outStream = new ByteArrayOutputStream();
        bitmap.compress(Bitmap.CompressFormat.JPEG, 100, outStream);
        return outStream.toByteArray();
    } catch (FileNotFoundException e) {
        Log.v("FileOP Debug", "Exception " + e);
        return null;
    } finally {
        if (inStream != null) {
            try {
                inStream.close();
            } catch (IOException ignored) {
            }
        }
        if (bitmap != null) {
            bitmap.recycle();
        }
    }
}

现在,图像创建没有问题。我可以去模拟器,查看照片的应用程序,然后获取a photo with this info

但是,当代码为inStream提供一个值时,我收到此错误:

  

java.io.FileNotFoundException:/ file:   /storage/emulated/0/DCIM/Camera/JPEG_Image_for_Stack_3248071614992872091.jpg   (没有这样的文件或目录)。

我不完全明白这是怎么回事。该项目明确存在,并保存在手机上。该应用程序确实请求并被授予写入外部存储的权限,并且我已经检查了它给出的模拟器权限。写也附带读取,因此,就我所知,这不应成为问题。所提供的任何帮助都将非常感激,因为我在这里对抗砖墙。还告诉我,如果我需要提供任何其他代码,我不确定这是否是你需要看到的。

编辑:显示调用此代码的位置。

        else if (requestCode == IMAGE_CAPTURE) {
            galleryAddPic();

            Intent mediaScanIntent = new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE);
            File f = new File(currentPhotoPath);
            Uri contentUri = Uri.fromFile(f);
            mediaScanIntent.setData(contentUri);

            final ProgressDialog progress = new ProgressDialog(getContextOfApplication());
            progress.setTitle("Loading");
            progress.setMessage("Identify your flower..");
            progress.setCancelable(false);
            progress.show();

            if (!CheckNetworkConnection.isInternetAvailable(getContextOfApplication())) {
                progress.dismiss();
                Toast.makeText(getContextOfApplication(),
                        "Internet connection unavailable.",
                        Toast.LENGTH_SHORT).show();
                return;
            }
            client = ClarifaiClientGenerator.generate(API_KEY);
            final byte[] imageBytes = FileOp.getByteArrayFromIntentData(getContextOfApplication(), mediaScanIntent);

截至目前,imageBytes将为null,因为该方法调用将引发FileNotFound异常。

1 个答案:

答案 0 :(得分:0)

你可以尝试这段代码......

public class Images extends Activity
{
private Uri[] mUrls;
String[] mFiles=null;

public void onCreate(Bundle icicle)
{

    super.onCreate(icicle);
    setContentView(R.layout.images);

    File images = Environment.getDataDirectory();
    File[] imagelist = images.listFiles(new FilenameFilter(){
    @override
    public boolean accept(File dir, String name)
    {
        return ((name.endsWith(".jpg"))||(name.endsWith(".png"))
    }
});
    mFiles = new String[imagelist.length];

    for(int i= 0 ; i< imagelist.length; i++)
    {
        mFiles[i] = imagelist[i].getAbsolutePath();
    }
    mUrls = new Uri[mFiles.length];

    for(int i=0; i < mFiles.length; i++)
    {
        mUrls[i] = Uri.parse(mFiles[i]);   
    }   

    Gallery g = (Gallery) findViewById(R.id.gallery);
    g.setAdapter(new ImageAdapter(this));
    g.setFadingEdgeLength(40);
}
public class ImageAdapter extends BaseAdapter{

    int mGalleryItemBackground;
    public ImageAdapter(Context c)  {   
        mContext = c;   
    }
    public int getCount(){
        return mUrls.length;
    }
    public Object getItem(int position){
        return position;
    }
    public long getItemId(int position) {
        return position;
    }
    public View getView(int position, View convertView, ViewGroup parent){
        ImageView i = new ImageView(mContext);

        i.setImageURI(mUrls[position]);
        i.setScaleType(ImageView.ScaleType.FIT_XY);
        i.setLayoutParams(new Gallery.LayoutParams(260, 210));
        return i;
    }   
    private Context mContext;
    }   
}