使用FileProvider共享文件

 需要一下几步
一、在共享端设置

首先,需要在 Menifest里添加 provider 标签,
[html]  view plain  copy
  1. <!-- 在这里定义共享信息 -->  
  2.         <provider  
  3.             android:name="android.support.v4.content.FileProvider"  
  4.             android:authorities="com.example.fileproviderdemo.fileprovider"  
  5.             android:exported="false"  
  6.             android:grantUriPermissions="true" >  
  7.             <meta-data  
  8.                 android:name="android.support.FILE_PROVIDER_PATHS"  
  9.                 android:resource="@xml/filepaths" />  
  10.         </provider>  



然后,指定共享目录
     在res目录下,新建目录xml,在xml下新建filepaths.xml 文件
[html]  view plain  copy
  1. <?xml version="1.0" encoding"utf-8"?>  
  2. <resources>  
  3.     <paths >  
  4.       <files-path path="files/" name="intfiles" />  
  5.       <external-path path="files/" name="extfiles" />  
  6.     </paths >  
  7. </resources>  

     别忘了外部路径需要权限。

二、创建一个文件选择Activity。
[html]  view plain  copy
  1. <!-- 文件选择页面ACTIVITY -->  
  2. <activity  
  3.     android:name=".FileSelectActivity"  
  4.     android:label="@string/app_name" >  
  5.     <intent-filter>  
  6.         <action android:name="android.intent.action.PICK" />  
  7.   
  8.         <category android:name="android.intent.category.DEFAULT" />  
  9.         <category android:name="android.intent.category.OPENABLE" />  
  10.   
  11.         <data android:mimeType="text/plain" />  
  12.         <data android:mimeType="image/*" />  
  13.     </intent-filter>  
  14. </activity>  


三、在代码中响应

       
[java]  view plain  copy
  1. /*当条目被点击时,设置setResult,将选择的结果返回给调用此activity的activity*/  
  2.        @Override  
  3.        public boolean onChildClick (ExpandableListView parent, View v,  
  4.                    int groupPosition, int childPosition, long id) {  
  5.             /*得到点击的File*/  
  6.             File file = ((File[])mGroupMap.get(mGroups [groupPosition]))[childPosition];  
  7.             Uri fileUri;  
  8.             /*authority 必须和Menifest的provider标签里定义的一致*/  
  9.             String authority = getResources().getString(R.string.fileprovider_authority );  
  10.              try {  
  11.                  fileUri = FileProvider. getUriForFile(  
  12.                     FileSelectActivity. this,  
  13.                     authority,  
  14.                     file);  
  15.             Intent resultIntent = new Intent();  
  16.             if (fileUri != null) {  
  17.                   resultIntent.addFlags(  
  18.                          Intent. FLAG_GRANT_READ_URI_PERMISSION );  
  19.                 // Put the Uri and MIME type in the result Intent  
  20.                   resultIntent.setDataAndType(  
  21.                         fileUri,  
  22.                         getContentResolver().getType(fileUri));  
  23.                 // 设置返回结果状态,  
  24.                   setResult(Activity. RESULT_OK,  
  25.                               resultIntent);  
  26.             } else {  
  27.                   resultIntent.setDataAndType( null"" );  
  28.                   setResult( RESULT_CANCELED,  
  29.                               resultIntent);  
  30.             }                          
  31.             finish();                        
  32.         } catch (Exception e) {  
  33.             e.printStackTrace();                           
  34.         }  
  35.              finally{  
  36.                   finish();  
  37.             }  
  38.              return true ;  
  39.       }  


四、在请求端,也就是请求共享的App的代码中,发起请求
[java]  view plain  copy
  1. Intent intent = new Intent(Intent.ACTION_PICK);  
  2.                  intent.setType( "text/plain");  
  3.                  startActivityForResult(intent, 0);  


     被调用Activity返回前,调用setResult方法,设置了 RESULT_OK,在被调用Activity结束后,系统会调用 onActivityResult方法
          得到之前设置的RESULT_OK状态,表示成功获取到文件。如果获取失败,则应该设置RESULT_CANCEL。
[java]  view plain  copy
  1.  @Override  
  2.  public void onActivityResult(int requestCode, int resultCode,  
  3.             Intent data) {  
  4.        // TODO Auto-generated method stub  
  5.        if (resultCode != RESULT_OK) {  
  6.              tvFileContent.setText("未成功获得文件" );  
  7.              tvFileName.setText("未成功获得文件" );  
  8.       } else {  
  9.             readFile(data.getData());  
  10.       }  
  11. }  
  12.   
  13.  private void readFile(Uri returnUri) {  
  14.       Context context = getActivity();  
  15.       ParcelFileDescriptor inputPFD;  
  16.        //获取文件句柄  
  17.        try {                  
  18.             inputPFD = context.getContentResolver().openFileDescriptor(returnUri, "r" );  
  19. catch (FileNotFoundException e) {  
  20.     e.printStackTrace();  
  21.     tvFileContent.setText("获取文件句柄失败" );  
  22.     tvFileName.setText("获取文件句柄失败" );  
  23.     return;  
  24. }  
  25.         
  26.        //获取文件名字和大小  
  27.        Cursor returnCursor =  
  28.             context.getContentResolver().query(returnUri, nullnull , nullnull);  
  29.     /* 
  30.      * Get the column indexes of the data in the Cursor, 
  31.      * move to the first row in the Cursor, get the data, 
  32.      * and display it. 
  33.      */  
  34.     int nameIndex = returnCursor.getColumnIndex(OpenableColumns.DISPLAY_NAME);  
  35.     int sizeIndex = returnCursor.getColumnIndex(OpenableColumns.SIZE);  
  36.     returnCursor.moveToFirst();  
  37.     tvFileName.setText("文件名:" +returnCursor.getString(nameIndex)+", 大小:"+  
  38.     Long. toString(returnCursor.getLong(sizeIndex))+" B");  
  39.       returnCursor.close();  
  40.         
  41.        //读取文件内容  
  42.       String content = "";  
  43.       FileReader fr = null;  
  44.        char[] buffer = new char[1024];  
  45.         
  46.        try {  
  47.             StringBuilder strBuilder = new StringBuilder();  
  48.             fr = new FileReader(inputPFD.getFileDescriptor());  
  49.              while (fr.read(buffer) != -1) {  
  50.                   strBuilder.append(buffer);  
  51.             }  
  52.             fr.close();  
  53.             content = strBuilder.toString();  
  54.       } catch (Exception e) {  
  55.              // TODO Auto-generated catch block  
  56.             e.printStackTrace();  
  57.       }  
  58.         
  59.        if (content.length() != 0) {  
  60.              tvFileContent.setText(content);  
  61.       } else {  
  62.              tvFileContent.setText("<内容空>" );  
  63.       }  
  64.         
  65.        try {  
  66.             inputPFD.close();  
  67.       } catch (IOException e) {  
  68.              // TODO Auto-generated catch block  
  69.             e.printStackTrace();  
  70.       }  
package com.example.tigongzhe; import android.R.integer; import android.content.ContentProvider; import android.content.ContentUris; import android.content.ContentValues; import android.content.Context; import android.content.UriMatcher; import android.database.Cursor; import android.database.sqlite.SQLiteDatabase; import android.database.sqlite.SQLiteDatabase.CursorFactory; import android.database.sqlite.SQLiteOpenHelper; import android.net.Uri; import android.provider.SyncStateContract.Helpers; import android.text.Selection; import android.util.Log; public class provider extends ContentProvider { private MyOpenHelper myOpenHelper; private SQLiteDatabase sqLiteDatabase; private static final UriMatcher URI_MATCHER=new UriMatcher(UriMatcher.NO_MATCH); private final String TAG="provider"; private static final String authority="com.example.tigongzhe.provider"; static { URI_MATCHER.addURI(authority, "contacter", 1); URI_MATCHER.addURI(authority, "contacter/#", 2); } private static final String _id="id"; private static final String name="name"; private static final String num="num"; @Override public boolean onCreate() { // TODO Auto-generated method stub myOpenHelper=new MyOpenHelper(getContext(), DB_Name, null, version_1); return true; } @Override public String getType(Uri uri) { // TODO Auto-generated method stub int flag=URI_MATCHER.match(uri); switch (flag) { case 2: return "vnd.android.cursor.item/contacter"; case 1: return "vnd.android.dir.item/contacter"; default: throw new IllegalArgumentException("异常参数"); } } @Override public Uri insert(Uri uri, ContentValues values) { // TODO Auto-generated method stub sqLiteDatabase=myOpenHelper.getWritableDatabase(); int flag=URI_MATCHER.match(uri); switch (flag) { case 1: sqLiteDatabase.insert(Table_Name, name, values); break; case 2: long id=sqLiteDatabase.insert(Table_Name, name, values); ContentUris.withAppendedId(uri, id); default: break; } return uri; } @Override public Cursor query(Uri uri, String[] arg1, String arg2, String[] arg3, String arg4) { // TODO Auto-generated method stub Cursor cursor; sqLiteDatabase=myOpenHelper.getReadableDatabase(); int flag=URI_MATCHER.match(uri); switch (flag) { case 1: cursor=sqLiteDatabase.query(Table_Name, arg1, arg2, arg3, null, null,arg4); break; case 2: long id=ContentUris.parseId(uri); arg2=(arg2==null||"".equals(arg2.trim()))? _id+"="+id:arg2+"and"+_id+"="+id; cursor=sqLiteDatabase.query(Table_Name, arg1, arg2, arg3, null, null,arg4); default: throw new IllegalArgumentException("参数错误"); } return cursor; } @Override public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs) { // TODO Auto-generated method stub int num=0; sqLiteDatabase=myOpenHelper.getWritableDatabase(); int flag=URI_MATCHER.match(uri); switch (flag) { case 1: num=sqLiteDatabase.update(Table_Name, values,selection, selectionArgs); break; case 2: long id=ContentUris.parseId(uri); selection=(selection==null||"".equals(selection.trim()))? _id+"="+id:selection+"and"+_id+"="+id; num=sqLiteDatabase.update(Table_Name, values,selection, selectionArgs); default: break; } return num; } @Override public int delete(Uri uri, String selection, String[] selectionArgs) { // TODO Auto-generated method stub int num=0; sqLiteDatabase=myOpenHelper.getWritableDatabase(); int flag=URI_MATCHER.match(uri); switch (flag) { case 1: num=sqLiteDatabase.delete(Table_Name, selection, selectionArgs); break; case 2: long id=ContentUris.parseId(uri); selection=(selection==null||"".equals(selection.trim()))?_id+"="+id:selection+"and"+_id+"="+id; num=sqLiteDatabase.delete(Table_Name, selection, selectionArgs); default: throw new IllegalArgumentException("异常参数"); } return num; } private final String DB_Name = "mydb.db"; private final String Table_Name="contacter"; private final int version_1=1; private class MyOpenHelper extends SQLiteOpenHelper { public MyOpenHelper(Context context, String name, CursorFactory factory, int version) { super(context, name, factory, version); } /** * @description 当数据表无连接时创建新的表 */ @Override public void onCreate(SQLiteDatabase db) { String sql = " create table if not exists " + Table_Name + "(id INTEGER PRIMARY KEY AUTOINCREMENT," + "name varchar(64),num varchar(64))"; db.execSQL(sql); } /** * @description 当版本更新时触发的方法 */ @Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { String sql = " drop table if exists " + Table_Name; db.execSQL(sql); onCreate(db); } } } +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ <?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.example.tigongzhe" android:versionCode="1" android:versionName="1.0" > <uses-sdk android:minSdkVersion="8" android:targetSdkVersion="18" /> <application android:allowBackup="true" android:icon="@drawable/ic_launcher" android:label="@string/app_name" android:theme="@style/AppTheme" > <activity android:name="com.example.tigongzhe.MainActivity" android:label="@string/app_name" > <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> <provider android:name=".provider" android:authorities="com.example.tigongzhe.provider" android:multiprocess="true" android:exported="true" android:permission="com.example.tigongzhe.permission" ></provider> </application> <permission android:name="com.example.tigongzhe.permission" android:protectionLevel="normal"></permission> </manifest> ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++package com.example.tigongzhe; import android.R.integer; import android.content.ContentProvider; import android.content.ContentUris; import android.content.ContentValues; import android.content.Context; import android.content.UriMatcher; import android.database.Cursor; import android.database.sqlite.SQLiteDatabase; import android.database.sqlite.SQLiteDatabase.CursorFactory; import android.database.sqlite.SQLiteOpenHelper; import android.net.Uri; import android.provider.SyncStateContract.Helpers; import android.text.Selection; import android.util.Log; public class provider extends ContentProvider { private MyOpenHelper myOpenHelper; private SQLiteDatabase sqLiteDatabase; private static final UriMatcher URI_MATCHER=new UriMatcher(UriMatcher.NO_MATCH); private final String TAG="provider"; private static final String authority="com.example.tigongzhe.provider"; static { URI_MATCHER.addURI(authority, "contacter", 1); URI_MATCHER.addURI(authority, "contacter/#", 2); } private static final String _id="id"; private static final String name="name"; private static final String num="num"; @Override public boolean onCreate() { // TODO Auto-generated method stub myOpenHelper=new MyOpenHelper(getContext(), DB_Name, null, version_1); return true; } @Override public String getType(Uri uri) { // TODO Auto-generated method stub int flag=URI_MATCHER.match(uri); switch (flag) { case 2: return "vnd.android.cursor.item/contacter"; case 1: return "vnd.android.dir.item/contacter"; default: throw new IllegalArgumentException("异常参数"); } } @Override public Uri insert(Uri uri, ContentValues values) { // TODO Auto-generated method stub sqLiteDatabase=myOpenHelper.getWritableDatabase(); int flag=URI_MATCHER.match(uri); switch (flag) { case 1: sqLiteDatabase.insert(Table_Name, name, values); break; case 2: long id=sqLiteDatabase.insert(Table_Name, name, values); ContentUris.withAppendedId(uri, id); default: break; } return uri; } @Override public Cursor query(Uri uri, String[] arg1, String arg2, String[] arg3, String arg4) { // TODO Auto-generated method stub Cursor cursor; sqLiteDatabase=myOpenHelper.getReadableDatabase(); int flag=URI_MATCHER.match(uri); switch (flag) { case 1: cursor=sqLiteDatabase.query(Table_Name, arg1, arg2, arg3, null, null,arg4); break; case 2: long id=ContentUris.parseId(uri); arg2=(arg2==null||"".equals(arg2.trim()))? _id+"="+id:arg2+"and"+_id+"="+id; cursor=sqLiteDatabase.query(Table_Name, arg1, arg2, arg3, null, null,arg4); default: throw new IllegalArgumentException("参数错误"); } return cursor; } @Override public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs) { // TODO Auto-generated method stub int num=0; sqLiteDatabase=myOpenHelper.getWritableDatabase(); int flag=URI_MATCHER.match(uri); switch (flag) { case 1: num=sqLiteDatabase.update(Table_Name, values,selection, selectionArgs); break; case 2: long id=ContentUris.parseId(uri); selection=(selection==null||"".equals(selection.trim()))? _id+"="+id:selection+"and"+_id+"="+id; num=sqLiteDatabase.update(Table_Name, values,selection, selectionArgs); default: break; } return num; } @Override public int delete(Uri uri, String selection, String[] selectionArgs) { // TODO Auto-generated method stub int num=0; sqLiteDatabase=myOpenHelper.getWritableDatabase(); int flag=URI_MATCHER.match(uri); switch (flag) { case 1: num=sqLiteDatabase.delete(Table_Name, selection, selectionArgs); break; case 2: long id=ContentUris.parseId(uri); selection=(selection==null||"".equals(selection.trim()))?_id+"="+id:selection+"and"+_id+"="+id; num=sqLiteDatabase.delete(Table_Name, selection, selectionArgs); default: throw new IllegalArgumentException("异常参数"); } return num; } private final String DB_Name = "mydb.db"; private final String Table_Name="contacter"; private final int version_1=1; private class MyOpenHelper extends SQLiteOpenHelper { public MyOpenHelper(Context context, String name, CursorFactory factory, int version) { super(context, name, factory, version); } /** * @description 当数据表无连接时创建新的表 */ @Override public void onCreate(SQLiteDatabase db) { String sql = " create table if not exists " + Table_Name + "(id INTEGER PRIMARY KEY AUTOINCREMENT," + "name varchar(64),num varchar(64))"; db.execSQL(sql); } /** * @description 当版本更新时触发的方法 */ @Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { String sql = " drop table if exists " + Table_Name; db.execSQL(sql); onCreate(db); } } }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值