安卓:调用系统分享txt文件到微信

昨天晚上搞了一下,不是闪退就是提示文件资源获取失败

心想着,代码没多大的问题啊,直到发现了一片文章:https://www.jianshu.com/p/796c28011dc2

我摘一下主要的信息

有些应用对于FileProvider生成的Uri无法识别,需要转化成MediaStore 的 content://。

微信就是其中之一

这是原文中的函数:不用管函数命名,这只是将路径文件转换为(MediaStore 的 content://)Uri的函数

public static Uri getImageContentUri(Context context, File imageFile) {
        String filePath = imageFile.getAbsolutePath();
        Cursor cursor = context.getContentResolver().query(MediaStore.Images.Media.EXTERNAL_CONTENT_URI,
                new String[] { MediaStore.Images.Media._ID }, MediaStore.Images.Media.DATA + "=? ",
                new String[] { filePath }, null);
        Uri uri = null;

        if (cursor != null) {
            if (cursor.moveToFirst()) {
                int id = cursor.getInt(cursor.getColumnIndex(MediaStore.MediaColumns._ID));
                Uri baseUri = Uri.parse("content://media/external/images/media");
                uri = Uri.withAppendedPath(baseUri, "" + id);
            }

            cursor.close();
        }

        if (uri == null) {
            ContentValues values = new ContentValues();
            values.put(MediaStore.Images.Media.DATA, filePath);
            uri = context.getContentResolver().insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, values);
        }

        return uri;
    }

我原先分享是这样写的,结果证明这样不行

uri = FileProvider.getUriForFile(mContext, mContext.getApplicationContext().getPackageName() + ".fileprovider", picFile);

需要改成这样

 uri = getImageContentUri(mContext, new File(Environment.getExternalStorageDirectory() + File.separator + "OwlDatabase" + File.separator + Filename));

File.separator ---------你就当成跨平台的反斜杠,linux和windows路径的分隔符不同

第一次写分享看这里

1.清单文件添加如下( 和activity server 并排不是相互嵌入)

        <provider
            android:name="android.support.v4.content.FileProvider"
            android:authorities="cc.booku.owlbox.FileProvider"
            android:exported="false"
            android:grantUriPermissions="true">
            <meta-data
                android:name="android.support.FILE_PROVIDER_PATHS"
                android:resource="@xml/file_paths" />
        </provider>

2.在资源文件创建file_paths
在这里插入图片描述
其中的代码:

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <paths>
        <external-path name="external_files" path="OwlDatabase"/>
    </paths>
</resources>

external_files----对应的是虚拟目录—/storage/emulated/0/
我后面加OwlDatabase/ 意味着我调用

Environment.getExternalStorageDirectory() + File.separator +
“OwlDatabase” + File.separator+“test.txt”
指向的就是;/storage/emulated/0/OwlDatabase/test.txt

就这么理解吧~

activity中的函数,我动态申请了一下权限,获取
FileUrl--------------路径+文件名,例如:/storage/emulated/0/OwlDatabase/test.txt
filename------------文件名,例如:test.txt


    private void judgePermission(String FileUrl,String filename) {
        /**
         * 先检查权限是否打开,打开了就可以直接访问,未打开则先申请一波权限
         */
        if(ContextCompat.checkSelfPermission(MainActivity.this,Manifest.permission.WRITE_EXTERNAL_STORAGE)!=
                PackageManager.PERMISSION_GRANTED||(ContextCompat.checkSelfPermission(MainActivity.this,Manifest.permission.READ_EXTERNAL_STORAGE)!=PackageManager.PERMISSION_GRANTED)){
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
                makeAnExtraRequest();
            }
        }else{
            File f = new File(FileUrl);
            ShareUtils.shareWechatFriend(MainActivity.this,f,filename);
        }
    }

    @RequiresApi(api = Build.VERSION_CODES.M)
    private void makeAnExtraRequest() {
        int code = 100;
        String[] permissions = {
                Manifest.permission.READ_EXTERNAL_STORAGE,
                Manifest.permission.WRITE_EXTERNAL_STORAGE
        };

        for (String string : permissions) {
            if (this.checkSelfPermission(string) != PackageManager.PERMISSION_GRANTED) {
                this.requestPermissions(permissions, code);
                code++;
                return;
            }
        }
    }

ShareUtils,我用的一个博主的:地址:https://blog.csdn.net/wei8023hzp/article/details/98965398

我只是改了其中一行
在这里插入图片描述
就这些吧,存储权限也加一下

<!-- SD卡读写的权限 -->
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章