Android Wear:在本地保存文件

时间:2016-03-15 11:29:26

标签: file exception save wear-os java-io

可以将文件保存在可穿戴设备中吗? 我尝试在手机上使用相同的程序,但java.io发给我一个异常。

        File directory = null;

        File sd = Environment.getExternalStorageDirectory();
        String path = sd.getAbsolutePath();

        directory = new File(path, dirName);

        if (!directory.exists()) {
            directory.mkdirs();
        }

        File file = null;
        String extension = ".arff";
        String completeName = fileName + extension;

        try {
            file = new File(directory, completeName);
            if(!file.isFile())
                file.createNewFile();
            else {

                String[] parts = fileName.split("_");
                String baseName = parts[0];
                String num = parts[1];
                int i = Integer.parseInt(num);
                do{

                    String newFileName = baseName+"_"+(i+1)+extension;
                    file = new File(directory, newFileName);
                    i++;

                } while(file.isFile());

                file.createNewFile();
            }
        } catch (IOException e) {
            Log.e("ERROR", "Exception while creating file:" + e.toString());
        }

我必须写内部或外部存储吗?是否可以检索此文件?

提前致谢

2 个答案:

答案 0 :(得分:4)

我将举例说明如何存储图片并将其取回。

保存的2种方法:

private void saveBitmapIntoDevice(Bitmap bitmap, String imageName) {
    FileOutputStream out = null;
    try {
        out = new FileOutputStream(getOutputMediaFile(imageName));
        bitmap.compress(Bitmap.CompressFormat.PNG, 100, out); // bmp is your Bitmap instance
        // PNG is a lossless format, the compression factor (100) is ignored
    } catch (Exception e) {
        e.printStackTrace();
    } finally {
        try {
            if (out != null) {
                out.close();
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

private File getOutputMediaFile(String imageName){

    File mediaStorageDir = new File(this.getExternalFilesDir(null)
            + "/Android/data/"
            + getApplicationContext().getPackageName()
            + "/Files");

    // Create the storage directory if it does not exist
    if (! mediaStorageDir.exists()){
        if (! mediaStorageDir.mkdirs()){
            return null;
        }
    }

    File mediaFile;
    String mImageName="IMG_" + imageName + ".png";
    mediaFile = new File(mediaStorageDir.getPath() + File.separator + mImageName);
    return mediaFile;
}

如何获取数据:

                    File imgFile = getOutputMediaFile(imageName);

                    if(imgFile.exists()){
                        Bitmap myBitmap = BitmapFactory.decodeFile(imgFile.getAbsolutePath());
                        image2.setImageBitmap(myBitmap);
                    }

答案 1 :(得分:1)

看起来Wear不支持getExternalStorageDirectory();像你这样的mkdirs()电话也会失败。我可以推测,由于可穿戴设备上的存储空间非常有限,因此Google希望将其限制为在卸载应用时自动删除的目录。使用getExternalStorageDirectory()时,无法保证这一点。但那只是猜测。 :^)

您有理由使用这种传统方法吗?有很多新的API调用可以在Wear上正常工作。一个例子是Context.getExternalFilesDir()。如果您确实需要外部存储空间,这是getExternalStorageDirectory()电话的“插入式”替代品。

但值得注意的是,在可穿戴设备上,外部存储的想法有些不稳定。目前没有Wear设备支持SD卡,许多甚至不支持将它们安装到计算机所需的USB连接。正如getExternalFilesDir的文档所说,

  

如果共享存储设备被模拟(由...确定)   isExternalStorageEmulated(File)),它的内容由a支持   私有用户数据分区,这意味着没什么好处   这里存储数据而不是返回的私有目录   getFilesDir()等。

我建议您审核the Storage Options guide page,考虑一下您的应用在存储方面真正需要的内容,并使用一种更新,更集中的呼叫。