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

首頁 > 學(xué)院 > 開發(fā)設(shè)計(jì) > 正文

ContentProvider跨應(yīng)用獲取data/data/包名下的文件

2019-11-09 18:37:41
字體:
供稿:網(wǎng)友

一、新建一個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的時候 數(shù)據(jù)庫不需要關(guān)閉 * * @author mxy *         我們在操作該ContentProvider數(shù)據(jù)的時候,需要根據(jù)特定的Uri去操作 *         Uri構(gòu)造格式如下:content://<AndroidManifest.xml配置的provider的authorities名字>/自定義內(nèi)容 */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全手機(jī)唯一,不可與其他provider重復(fù);exported代表此文件可導(dǎo)出-->
三、另一個應(yīng)用通過provider獲取文件,我是通過AsyncTask獲取顯示(習(xí)慣了,,)

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應(yīng)用包名下files目錄下的bbb文件            InputStream is = getContentResolver().openInputStream(URI_KEY);//通過輸入流讀取文件            if (is != null) {                inputStreamToFile(is, file);//將輸入流轉(zhuǎn)換為文件            }            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權(quán)限手動添加的文件(隨便打幾個字符),通過ContentProvider獲取時會提示權(quán)限不足。但是通過代碼生成的文件則完全沒有問題,有發(fā)現(xiàn)并解決了這個問題的。請一定回復(fù)或郵件告訴我,謝謝。


發(fā)表評論 共有條評論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 鄂尔多斯市| 广平县| 福建省| 沙坪坝区| 九龙县| 交城县| 调兵山市| 西城区| 公安县| 大埔区| 泌阳县| 五指山市| 烟台市| 福清市| 敖汉旗| 红桥区| 邵阳市| 泸溪县| 水富县| 泸西县| 汝州市| 茌平县| 桦川县| 汽车| 博罗县| 柘荣县| 云和县| 冷水江市| 曲麻莱县| 自治县| 定襄县| 石首市| 吉隆县| 清原| 平泉县| 张家港市| 千阳县| 绥芬河市| 辽阳县| 砀山县| 乌兰浩特市|