国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

ContentProvider跨應用獲取data/data/包名下的文件

2019-11-09 17:31:36
字體:
來源:轉載
供稿:網友

一、新建一個MyPRovider類,重寫openFile方法。

package com.sh.main;/** * Desc: * Create by SunHang on 17-1-24 17:25 * Email:htuhang@163.com */import android.content.ContentProvider;import android.content.ContentValues;import android.content.UriMatcher;import android.database.Cursor;import android.net.Uri;import android.os.ParcelFileDescriptor;import android.support.annotation.Nullable;import android.util.Log;import com.eetrust.utils.LogUtil;import java.io.File;import java.io.FileNotFoundException;/** * 使用contentProvider的時候 數據庫不需要關閉 * * @author mxy *         我們在操作該ContentProvider數據的時候,需要根據特定的Uri去操作 *         Uri構造格式如下:content://<AndroidManifest.xml配置的provider的authorities名字>/自定義內容 */public class MyProvider extends ContentProvider {    private static int GET_FILE = 1;    private static final String TAG = "MyProvider";    private static final String FileName = "MYFILE";    private static final String DirName = "MYDIR";    private static UriMatcher matcher = new UriMatcher(UriMatcher.NO_MATCH);    static {        matcher.addURI("com.sh.main.MyProvider", "getUri", GET_FILE);    }    private String pathName;    @Override    public boolean onCreate() {        return false;    }    @Nullable    @Override    public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) {        return null;    }    @Nullable    @Override    public String getType(Uri uri) {        return null;    }    @Nullable    @Override    public Uri insert(Uri uri, ContentValues values) {        return null;    }    @Override    public int delete(Uri uri, String selection, String[] selectionArgs) {        return 0;    }    @Override    public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs) {        return 0;    }    @Nullable    @Override    public ParcelFileDescriptor openFile(Uri uri, String mode) throws FileNotFoundException {        Log.d(TAG, "openFile: uri = " + uri);        File path = getContext().getDir(DirName, getContext().MODE_PRIVATE);        pathName = path.getPath() + File.separator;//文件夾路徑        Log.d(TAG, "openFile: " + pathName + FileName);        File file = new File(pathName, FileName);//文件路徑        if (fileExist()) {            return ParcelFileDescriptor.open(file, ParcelFileDescriptor.MODE_READ_WRITE);        } else {            System.out.println("文件不存在");            return null;        }    }    public boolean fileExist() {        File fname;        boolean result = false;        LogUtil.d(TAG, "FileExist()");        try {            fname = new File(pathName, FileName);            if (fname.exists() && fname.isFile()) {                result = true;            }        } catch (SecurityException se) {            LogUtil.e(TAG, se.toString());        }        return result;    }}二、AndroidManifest中聲明

        <provider android:name="com.sh.main.MyProvider"            android:authorities="com.sh.main.MyProvider"            android:exported="true" >        </provider>
<!--authorities全手機唯一,不可與其他provider重復;exported代表此文件可導出-->
三、另一個應用通過provider獲取文件,我是通過AsyncTask獲取顯示(習慣了,,)

package com.sh.myapplicationb;import android.net.Uri;import android.os.AsyncTask;import android.os.Bundle;import android.support.v7.app.AppCompatActivity;import android.widget.TextView;import java.io.File;import java.io.FileNotFoundException;import java.io.FileOutputStream;import java.io.IOException;import java.io.InputStream;import java.io.OutputStream;public class MainActivity extends AppCompatActivity {    private TextView tv_get_provider;    public static final Uri URI_KEY = Uri.parse("content://com.sh.main.MyProvider");    private File providerFile;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        tv_get_provider = (TextView) findViewById(R.id.tv_get_provider);        getProvider.execute(new Void[]{});    }    AsyncTask<Void, Void, Integer> getProvider = new AsyncTask<Void, Void, Integer>() {        @Override        protected Integer doInBackground(Void... voids) {            providerFile = getProviderFile();//通過provider獲取文件            if (providerFile != null) {                return 1;            } else {                return 0;            }        }        @Override        protected void onPostExecute(Integer integer) {            if (integer == 1) {                tv_get_provider.setText(providerFile.length()+"");//如果獲取到文件大小等于源文件,則表示成功            } else {                tv_get_provider.setText("NULL");            }        }    };    public File getProviderFile() {        try {            File file = new File(MainActivity.this.getFilesDir(), "bbb");//文件的存放位置,這里保存為B應用包名下files目錄下的bbb文件            InputStream is = getContentResolver().openInputStream(URI_KEY);//通過輸入流讀取文件            if (is != null) {                inputStreamToFile(is, file);//將輸入流轉換為文件            }            return file;        } catch (FileNotFoundException e) {            e.printStackTrace();            return null;        }    }    public void inputStreamToFile(InputStream ins,File file){        OutputStream os = null;        try {            os = new FileOutputStream(file);        } catch (FileNotFoundException e) {            e.printStackTrace();        }        int bytesRead = 0;        byte[] buffer = new byte[8192];        try {            while ((bytesRead = ins.read(buffer, 0, 8192)) != -1) {                os.write(buffer, 0, bytesRead);            }        } catch (IOException e) {            e.printStackTrace();        }        try {            os.close();        } catch (IOException e) {            e.printStackTrace();        }        try {            ins.close();        } catch (IOException e) {            e.printStackTrace();        }    }}四、有個蛋疼的問題,用genymotion模擬器,通過root權限手動添加的文件(隨便打幾個字符),通過ContentProvider獲取時會提示權限不足。但是通過代碼生成的文件則完全沒有問題,有發現并解決了這個問題的。請一定回復或郵件告訴我,謝謝。


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 垦利县| 石门县| 淮北市| 沧州市| 常宁市| 靖边县| 游戏| 鄢陵县| 通榆县| 翼城县| 突泉县| 库伦旗| 湟中县| 阿克陶县| 元氏县| 绵竹市| 延寿县| 武山县| 玛纳斯县| 卓资县| 平潭县| 南城县| 南宫市| 开化县| 深圳市| 东安县| 葵青区| 黔西| 张掖市| 临夏市| 苏尼特左旗| 微山县| 台州市| 镇坪县| 涡阳县| 曲麻莱县| 山东省| 舞阳县| 安化县| 东乡县| 东乡县|