使用BitmapFactory检索图像 - SkImageDecoder null返回错误

时间:2014-07-14 15:06:01

标签: android surfaceview android-bitmap

我正在尝试使用Android中的片段(噩梦)中的表面视图来检索我(我认为)已保存的图像。在这里,我尝试保存图像并列出目录中的所有图像。我绝对不知道目录在哪里(storate / emulated / 0等)。我无法在任何地方找到图像,除了像这样列出它们。这告诉我他们可能存在?

jpegCallback = new Camera.PictureCallback() {
    public void onPictureTaken(byte[] data, Camera camera) {


        // Create an image file name
        File image = null;
        String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss").format(new Date());
        String imageFileName = "JPEG_" + timeStamp + "_";
        File storageDir = Environment.getExternalStoragePublicDirectory(
                Environment.DIRECTORY_PICTURES);
        try {
            image = File.createTempFile(
                    imageFileName,  /* prefix */
                    ".jpg",         /* suffix */
                    storageDir      /* directory */
            );
        } catch (IOException e) {
            e.printStackTrace();
        }

        String path = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES).toString();
        Log.d("Files", "Path: " + path);
        File f = new File(path);
        File file[] = f.listFiles();
        Log.d("Files", "Size: "+ file.length);
        String filename = "";
        for (int i=0; i < file.length; i++)
        {
            Log.d("Files", "FileName "+i+" :" + file[i].getName());
            filename = file[i].getName();
        }

        Bitmap myBitmap = BitmapFactory.decodeFile(file[0].getAbsolutePath()+"/"+filename);

        ImageView taken_pic = (ImageView) view.findViewById(R.id.taken_pic);
        taken_pic.setImageBitmap(myBitmap);

    }
};

这只是给我一个图像名称列表和'SkImageDecoder :: Factory返回null'消息。我可能用文件名字符串使事情变得更糟,但即使在列表中的其中一个文件中硬编码,我也会得到相同的结果。图像是否应该基于此代码的结果存在?我怎样才能将图像再次作为位图获取?有一个更好的方法吗。我已经尝试了每个可以找到并阅读每个主题的例子。

1 个答案:

答案 0 :(得分:0)

这是我现在正在使用的一个按钮的示例,该按钮将用于显示相机以正确保存图像(当前为下载文件夹)的Surfaceview,检索它并将其输出到imageview(当前为“taken_pic”)。

不确定我错在哪里。我想只是在几个小地方。调试这个问题很困难。我的手机没有扎根,所以我认为我对Android Studios Device Monitor的选择有限。通常,您不会看到通过PC资源管理器浏览时保存的图像。移除USB,重新启动手机,文件应显示在应有的位置。

我希望这对某人有所帮助。

        camera_picture.setOnClickListener(new Button.OnClickListener() {
            @Override
            public void onClick(View v) {
                captureImage();
            }
        });

        private void captureImage() {
            cam.takePicture(shutterCallback, rawCallback, jpegCallback);
        }

        rawCallback = new Camera.PictureCallback() {
            public void onPictureTaken(byte[] data, Camera camera) {
                Log.d("Log", "onPictureTaken - raw");
            }
        };

        /** Handles data for jpeg picture */
        shutterCallback = new Camera.ShutterCallback() {
            public void onShutter() {
                Log.i("Log", "onShutter'd");
            }
        };

        jpegCallback = new Camera.PictureCallback() {
            public void onPictureTaken(byte[] data, Camera camera) {
                FileOutputStream outStream = null;
                try {
                    File fileb = new     File(android.os.Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS), "imagename2.jpg");
                    outStream = new FileOutputStream(fileb);
                    outStream.write(data);
                    outStream.close();
                    Log.d("Log", "onPictureTaken - wrote bytes: " + data.length);
                } catch (FileNotFoundException e) {
                    e.printStackTrace();
                } catch (IOException e) {
                    e.printStackTrace();
                } finally {
            }
            Log.d("Log", "onPictureTaken - jpeg");


            String photoPath = android.os.Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS)+"/imagename.jpg";
            BitmapFactory.Options options = new BitmapFactory.Options();
            options.inPreferredConfig = Bitmap.Config.ARGB_8888;
            Bitmap bitmap = BitmapFactory.decodeFile(photoPath, options);

            ImageView taken_pic = (ImageView) view.findViewById(R.id.taken_pic);
            taken_pic.setImageBitmap(bitmap);
        }