歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux編程 >> Linux編程 >> Android通過ContentProvider傳輸文件

Android通過ContentProvider傳輸文件

日期:2017/3/1 10:12:56   编辑:Linux編程

我們知道Android兩個應用程序之間進行數據交互需要通過ContentProvider,而且通常都是數據庫的操作。
今天項目需要使用Android的ContentProvider交互普通SD卡上的文件,於是我寫了這個小例子:

AndroidManifest.xml

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <manifest xmlns:android="http://schemas.android.com/apk/res/android"
  3. package="com.h3c.test"
  4. android:versionCode="1"
  5. android:versionName="1.0" >
  6. <uses-sdk android:minSdkVersion="15" />
  7. <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
  8. <application
  9. android:icon="@drawable/ic_launcher"
  10. android:label="@string/app_name" >
  11. <activity
  12. android:label="@string/app_name"
  13. android:name=".NotepadTestActivity" >
  14. <intent-filter >
  15. <action android:name="android.intent.action.MAIN" />
  16. <category android:name="android.intent.category.LAUNCHER" />
  17. </intent-filter>
  18. </activity>
  19. <provider android:name=".TestContentProvider" android:authorities="com.h3c.test" />
  20. </application>
  21. </manifest>
TestContentProvider.java
  1. package com.h3c.test;
  2. import java.io.File;
  3. import java.io.FileNotFoundException;
  4. import java.io.IOException;
  5. import java.util.ArrayList;
  6. import android.content.ContentProvider;
  7. import android.content.ContentProviderOperation;
  8. import android.content.ContentProviderResult;
  9. import android.content.ContentValues;
  10. import android.content.OperationApplicationException;
  11. import android.content.res.AssetFileDescriptor;
  12. import android.database.Cursor;
  13. import android.net.Uri;
  14. import android.os.Environment;
  15. import android.os.ParcelFileDescriptor;
  16. import android.util.Log;
  17. public class TestContentProvider extends ContentProvider {
  18. @Override
  19. public int delete(Uri uri, String selection, String[] selectionArgs) {
  20. // TODO Auto-generated method stub
  21. Log.e("H3c", "delete");
  22. return 0;
  23. }
  24. @Override
  25. public String getType(Uri uri) {
  26. // TODO Auto-generated method stub
  27. Log.e("H3c", "gettype");
  28. return null;
  29. }
  30. @Override
  31. public Uri insert(Uri uri, ContentValues values) {
  32. // TODO Auto-generated method stub
  33. Log.e("H3c", "insert");
  34. return null;
  35. }
  36. @Override
  37. public boolean onCreate() {
  38. // TODO Auto-generated method stub
  39. Log.e("H3c", "create");
  40. return false;
  41. }
  42. @Override
  43. public Cursor query(Uri uri, String[] projection, String selection,
  44. String[] selectionArgs, String sortOrder) {
  45. // TODO Auto-generated method stub
  46. Log.e("H3c", "query");
  47. return null;
  48. }
  49. @Override
  50. public int update(Uri uri, ContentValues values, String selection,
  51. String[] selectionArgs) {
  52. // TODO Auto-generated method stub
  53. Log.e("H3c", "update");
  54. return 0;
  55. }
  56. @Override
  57. public AssetFileDescriptor openAssetFile(Uri uri, String mode)
  58. throws FileNotFoundException {
  59. // TODO Auto-generated method stub
  60. Log.e("H3c", "openAssetFile");
  61. return super.openAssetFile(uri, mode);
  62. }
  63. //此方法非常重要,一定要重寫,否則默認報FileNotFound異常
  64. @Override
  65. public ParcelFileDescriptor openFile(Uri uri, String mode)
  66. throws FileNotFoundException {
  67. // TODO Auto-generated method stub
  68. File root = Environment.getExternalStorageDirectory();
  69. root.mkdirs();
  70. File path = new File(root, uri.getEncodedPath());
  71. Log.e("H3c", "opeFile:"+path);
  72. int imode = 0;
  73. if (mode.contains("w")) {
  74. imode |= ParcelFileDescriptor.MODE_WRITE_ONLY;
  75. if (!path.exists()) {
  76. try {
  77. path.createNewFile();
  78. } catch (IOException e) {
  79. e.printStackTrace();
  80. }
  81. }
  82. }
  83. if (mode.contains("r"))
  84. imode |= ParcelFileDescriptor.MODE_READ_ONLY;
  85. if (mode.contains("+"))
  86. imode |= ParcelFileDescriptor.MODE_APPEND;
  87. return ParcelFileDescriptor.open(path, imode);
  88. }
  89. }
NotepadTestActivity.java
  1. package com.h3c.test;
  2. import java.io.File;
  3. import java.io.FileInputStream;
  4. import java.io.FileNotFoundException;
  5. import java.io.FileOutputStream;
  6. import java.io.IOException;
  7. import java.io.InputStream;
  8. import java.io.OutputStream;
  9. import java.lang.reflect.InvocationTargetException;
  10. import java.lang.reflect.Method;
  11. import android.app.Activity;
  12. import android.content.Context;
  13. import android.content.pm.PackageManager.NameNotFoundException;
  14. import android.content.res.AssetFileDescriptor;
  15. import android.net.Uri;
  16. import android.os.Bundle;
  17. import android.util.Log;
  18. import android.view.View;
  19. import android.view.View.OnClickListener;
  20. import android.widget.Button;
  21. public class NotepadTestActivity extends Activity {
  22. @Override
  23. protected void onCreate(Bundle savedInstanceState) {
  24. // TODO Auto-generated method stub
  25. super.onCreate(savedInstanceState);
  26. setContentView(R.layout.notepad);
  27. Button button = (Button) findViewById(R.id.notepad);
  28. button.setOnClickListener(new OnClickListener() {
  29. @Override
  30. public void onClick(View v) {
  31. try {
  32. // 直接讀文件
  33. // InputStream is = getContentResolver().openInputStream(
  34. // Uri.parse("file:/mnt/sdcard/h3c.txt"));
  35. //
  36. // File bkFile = new File("/mnt/sdcard/h3c2.txt");
  37. // if (!bkFile.exists()) {
  38. // bkFile.createNewFile();
  39. // }
  40. //
  41. // FileOutputStream out = new FileOutputStream(bkFile);
  42. // byte[] b = new byte[1024 * 5]; // 5KB
  43. // int len;
  44. // while ((len = is.read(b)) != -1) {
  45. // out.write(b, 0, len);
  46. // }
  47. // out.flush();
  48. // is.close();
  49. // out.close();
  50. // 直接寫文件
  51. // OutputStream out = getContentResolver().openOutputStream(
  52. // Uri.parse("file:/mnt/sdcard/h3c.txt"));
  53. // FileInputStream in = new FileInputStream(new File(
  54. // "/mnt/sdcard/h3c3.txt"));
  55. //
  56. // byte[] b = new byte[1024 * 5]; // 5KB
  57. // int len;
  58. // while ((len = in.read(b)) != -1) {
  59. // out.write(b, 0, len);
  60. // }
  61. // out.flush();
  62. //
  63. // in.close();
  64. // out.close();
  65. // 內容流寫
  66. // AssetFileDescriptor afd = getContentResolver()
  67. // .openAssetFileDescriptor(
  68. // Uri.parse("content://com.h3c.test/h3c.txt"),
  69. // "wr");
  70. // InputStream in = afd.createInputStream();
  71. // File bkFile = new File("/mnt/sdcard/h3c2.txt");
  72. // if (!bkFile.exists()) {
  73. // bkFile.createNewFile();
  74. // }
  75. //
  76. // FileOutputStream out = new FileOutputStream(bkFile);
  77. // byte[] b = new byte[1024 * 5]; // 5KB
  78. // int len;
  79. // while ((len = in.read(b)) != -1) {
  80. // out.write(b, 0, len);
  81. // }
  82. // out.flush();
  83. // in.close();
  84. // out.close();
  85. // 內容流讀
  86. AssetFileDescriptor afd = getContentResolver()
  87. .openAssetFileDescriptor(
  88. Uri.parse("content://com.h3c.test/h3c.txt"),
  89. "wr");
  90. OutputStream out = afd.createOutputStream();
  91. FileInputStream in = new FileInputStream(new File(
  92. "/mnt/sdcard/h3c2.txt"));
  93. byte[] b = new byte[1024 * 5]; // 5KB
  94. int len;
  95. while ((len = in.read(b)) != -1) {
  96. out.write(b, 0, len);
  97. }
  98. out.flush();
  99. in.close();
  100. out.close();
  101. } catch (FileNotFoundException e) {
  102. e.printStackTrace();
  103. } catch (IOException e) {
  104. e.printStackTrace();
  105. }
  106. }
  107. });
  108. }
  109. }
Copyright © Linux教程網 All Rights Reserved