Bmob文件上传/下载出现的各种问题记录

1、java.util.concurrent.ExecutionException: com.android.dex.DexException: Multiple dex files define 

     java.util.zip.ZipException: duplicate entry: okio/AsyncTimeout$1.class 

之前看文档看到说要okhttp-2.4.0、oki-1.4.0,就傻傻地去导入了,结果先是出现了Multiple dex files define 问题,心想那加句话不就好了。

defaultConfig {
    ……
    multiDexEnabled true
    ……
}

然后又出现了duplicate entry: okio/AsyncTimeout$1.class 错误。

我看了一下这个错误出现的原因,说是包重复了……

仔细想了想,Bmob其实早就打包了这个包了,根本不需要自己再去导入……成功的时候感觉之前的自己像个zz,想太多。


2、 Permission denied 权限问题

如果说你确定你在AndroidManifest有把权限都写了的话,比如 sd卡的存储 权限(具体权限可看文档)

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

但还是出现Permission denied,那么很有可能是因为你手机里的APP应用权限没开(有的时候APP默认权限都是无)。

在设置里—>打开权限管理 —> 找到APP —> 查看存储权限是否有开启。


3、bmobfile file does not exist 文件不存在问题

顾名思义,就是说bmobfile没有找到你传入的文件,那么明显就是传入的路径有问题。以我的错误示范为例(捂脸)

Uri imageUri = data.getData();
String imagePath =  imageUri.getPath();

我没怎么用过Uri,所以刚开始以为它的路径就是所要的路径,其实不是,它的路径是这样的。

content://media/external/images/media/62026

这并不是我想要的路径名,也不是BmobFile要的路径名,然后我心想那用.getPath();方法不就好了,然而并不行。

Uri和String的地址路径是必须要通过转换才可以的,方法当然也不是简单的.toString就可以了。

因此解决方法就是——将Uri转化成Sring地址路径,转化方法如下:(用的别人的方法,不是我写的。)

private String getPath(Context context, Uri uri) {
    final boolean isKitKat = Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT;

    // DocumentProvider
    if (isKitKat && DocumentsContract.isDocumentUri(context, uri)) {
        // ExternalStorageProvider
        if (isExternalStorageDocument(uri)) {
            final String docId = DocumentsContract.getDocumentId(uri);
            final String[] split = docId.split(":");
            final String type = split[0];

            if ("primary".equalsIgnoreCase(type)) {
                return Environment.getExternalStorageDirectory() + "/" + split[1];
            }
        }
        // DownloadsProvider
        else if (isDownloadsDocument(uri)) {

            final String id = DocumentsContract.getDocumentId(uri);
            final Uri contentUri = ContentUris.withAppendedId(
                    Uri.parse("content://downloads/public_downloads"), Long.valueOf(id));

            return getDataColumn(context, contentUri, null, null);
        }
        // MediaProvider
        else if (isMediaDocument(uri)) {
            final String docId = DocumentsContract.getDocumentId(uri);
            final String[] split = docId.split(":");
            final String type = split[0];

            Uri contentUri = null;
            if ("image".equals(type)) {
                contentUri = MediaStore.Images.Media.EXTERNAL_CONTENT_URI;
            } else if ("video".equals(type)) {
                contentUri = MediaStore.Video.Media.EXTERNAL_CONTENT_URI;
            } else if ("audio".equals(type)) {
                contentUri = MediaStore.Audio.Media.EXTERNAL_CONTENT_URI;
            }

            final String selection = "_id=?";
            final String[] selectionArgs = new String[]{split[1]};

            return getDataColumn(context, contentUri, selection, selectionArgs);
        }
    }
    // MediaStore (and general)
    else if ("content".equalsIgnoreCase(uri.getScheme())) {
        return getDataColumn(context, uri, null, null);
    }
    // File
    else if ("file".equalsIgnoreCase(uri.getScheme())) {
        return uri.getPath();
    }
    return null;
}
private String getDataColumn(Context context, Uri uri, String selection,
                             String[] selectionArgs) {
    Cursor cursor = null;
    final String column = "_data";
    final String[] projection = {column};

    try {
        cursor = context.getContentResolver().query(uri, projection, selection, selectionArgs,
                null);
        if (cursor != null && cursor.moveToFirst()) {
            final int column_index = cursor.getColumnIndexOrThrow(column);
            return cursor.getString(column_index);
        }
    } finally {
        if (cursor != null)
            cursor.close();
    }
    return null;
}
/**
 * @param uri The Uri to check.
 * @return Whether the Uri authority is ExternalStorageProvider.
 */
public boolean isExternalStorageDocument(Uri uri) {
    return "com.android.externalstorage.documents".equals(uri.getAuthority());
}

/**
 * @param uri The Uri to check.
 * @return Whether the Uri authority is DownloadsProvider.
 */
public boolean isDownloadsDocument(Uri uri) {
    return "com.android.providers.downloads.documents".equals(uri.getAuthority());
}

/**
 * @param uri The Uri to check.
 * @return Whether the Uri authority is MediaProvider.
 */
public boolean isMediaDocument(Uri uri) {
    return "com.android.providers.media.documents".equals(uri.getAuthority());
}

虽、虽然说看起来很多、很麻烦的样子,但是只要复制黏贴进去就好了嘛哈哈哈,而且这些会写的比较全面。


  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值