安卓:调用系统分享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 并排不是相互嵌入)

        
            
        

2.在资源文件创建file_paths
安卓:调用系统分享txt文件到微信_第1张图片
其中的代码:



    
        
    

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

我只是改了其中一行
安卓:调用系统分享txt文件到微信_第2张图片
就这些吧,存储权限也加一下


    
    

你可能感兴趣的:(android,android,安卓)