【问题标题】:Android can't open file in assets folderAndroid无法打开资产文件夹中的文件
【发布时间】:2018-12-31 10:30:24
【问题描述】:

我的应用允许用户将其数据导出给其他用户或仅保存为备份。
导入/导出工作正常

为了让用户在第一次安装我的应用程序时有一个示例数据,我想打包一些默认数据。我创建了示例数据,测试了它是否工作正常,然后我将它打包在assets 文件夹中,并在用户第一次运行应用程序时加载它。

但是我得到文件未找到异常

代码如下:

  private List<Giveaway> loadJsonData(Uri data, User user) {
        List<Giveaway> result = null;
        try {
            InputStream is = this.getContentResolver().openInputStream(data);
            Gson parser = new GsonBuilder().setDateFormat("dd/MM/yy").setFieldNamingPolicy(FieldNamingPolicy.LOWER_CASE_WITH_UNDERSCORES).setLongSerializationPolicy(LongSerializationPolicy.DEFAULT).setLenient().excludeFieldsWithModifiers(Modifier.FINAL, Modifier.STATIC, Modifier.TRANSIENT).create();

            Set<Giveaway> temp = new HashSet<Giveaway>(50);
            temp.addAll((Collection<? extends Giveaway>) parser.fromJson(new InputStreamReader(is), TypeToken.getParameterized(List.class, Giveaway.class).getType()));



            result = new ArrayList<Giveaway>(temp);
        } catch (FileNotFoundException e) {
            e.printStackTrace();
            result = new ArrayList<Giveaway>(1);
        }

        return result;


    }

我称之为:

loadJsonData(Uri.parse("file:///android_asset/giveaway_export.json"), sampleUser);

【问题讨论】:

    标签: android uri android-assets android-assetmanager


    【解决方案1】:

    使用AssetManager这是一个例子:

     AssetManager assetManager = getAssets();
                InputStream is = null;
                try {
                    is = assetManager.open("giveaway_export.json");
                } catch (IOException e) {
                    e.printStackTrace();
                }
    

    所以你必须改变你的方法:

     private List<Giveaway> loadJsonData(Uri data, User user) {
            List<Giveaway> result = null;
            try {
                //InputStream is = this.getContentResolver().openInputStream(data);
                AssetManager assetManager = getAssets();
                InputStream is = null;
                try {
                    is = assetManager.open("giveaway_export.json");
                } catch (IOException e) {
                    e.printStackTrace();
                }
                Gson parser = new GsonBuilder().setDateFormat("dd/MM/yy").setFieldNamingPolicy(FieldNamingPolicy.LOWER_CASE_WITH_UNDERSCORES).setLongSerializationPolicy(LongSerializationPolicy.DEFAULT).setLenient().excludeFieldsWithModifiers(Modifier.FINAL, Modifier.STATIC, Modifier.TRANSIENT).create();
    
                Set<Giveaway> temp = new HashSet<Giveaway>(50);
                temp.addAll((Collection<? extends Giveaway>) parser.fromJson(new InputStreamReader(is), TypeToken.getParameterized(List.class, Giveaway.class).getType()));
    
    
    
                result = new ArrayList<Giveaway>(temp);
            } catch (FileNotFoundException e) {
                e.printStackTrace();
                result = new ArrayList<Giveaway>(1);
            }
    
            return result;
    
        }
    

    请记住,如果您使用的是 android 6.0+,则需要声明权限:

    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
    

    并且需要手动权限:

    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M){
        //Verify permission for Android 6.0+
         checkExternalStoragePermission();
    }
    

    使用这个方法:

    private void checkExternalStoragePermission() {
        int permissionCheck = ContextCompat.checkSelfPermission(
                this, Manifest.permission.WRITE_EXTERNAL_STORAGE);
        if (permissionCheck != PackageManager.PERMISSION_GRANTED) {
            Log.i("Message", "You require permissions!.");
                ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, 225);
        } else {
            Log.i("Message", "you have already permissions!");
        }
    }
    

    【讨论】:

      【解决方案2】:

      file:///android_asset 适用于 WebView,几乎没有别的。使用AssetManager 来处理资产——您可以通过在Context 上调用getAssets() 来获得其中之一,例如您的Activity

      【讨论】:

        猜你喜欢
        • 2010-12-28
        • 2013-12-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-11-18
        • 1970-01-01
        • 2018-12-17
        • 1970-01-01
        相关资源
        最近更新 更多