安卓:調用系統分享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" />
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章