スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

Android ContentProviderのカスタマイズ

ContentProviderの実装ジッソウ
ホカのアプリへデータを提供テイキョウするために、ContentProviderを実装ジッソウします。
データを提供テイキョウするメモアプリ(ファイル作成サクセイガワ
・データを提供テイキョウするための簡単カンタンなメモアプリを作成サクセイします。
 今回コンカイはSQLiteではなく、テキストファイルでデータを保持ホジします。
 ButtonクリックにEditTextに入力ニュウリョクした文字列モジレツをテキストファイルに出力シュツリョクします。
○MemoSampleアクティビティクラス
1: package android.memo.sample;                                  
2:    
3: import java.io.BufferedReader;  
4: import java.io.BufferedWriter;    
5: import java.io.FileInputStream;  
6: import java.io.FileOutputStream;    
7: import java.io.InputStreamReader;  
8: import java.io.OutputStreamWriter;    
9: import java.util.ArrayList;  
10:    
11: import android.app.Activity;  
12: import android.app.ListActivity;    
13: import android.os.Bundle;  
14: import android.util.Log;    
15: import android.view.View;  
16: import android.view.View.OnClickListener;    
17: import android.widget.ArrayAdapter;  
18: import android.widget.Button;    
19: import android.widget.EditText;  
20: import android.widget.ListView;    
21:  
22: public class MemoSample extends ListActivity {    
23:  
24:   static final String MEMO_FILE_NAME = "memo.txt"; // 出力ファイル名    
25: private static final String NEW_LINE_CODE = System  
26:   .getProperty("line.separator"); // 改行コード    
27: private final ArrayList myMemo = new ArrayList(); // メモを保持するリスト  
28:   private EditText myMemoEdit;    
29: private ArrayAdapter myAdapter;  
30:    
31: @Override  
32:   public void onCreate(Bundle savedInstanceState) {    
33: super.onCreate(savedInstanceState);  
34:   setContentView(R.layout.main);    
35:  
36:   // 画面オブジェ抽出    
37: myMemoEdit = (EditText) findViewById(R.id.memo_ed); // Editオブジェ  
38:   Button btn = (Button) findViewById(R.id.save_btn); // Buttonオブジェ    
39: btn.setOnClickListener(saveClick); // クリックイベント設定  
40:    
41: try {  
42:   readFile(MEMO_FILE_NAME); // ファイルのRead      
43: } catch (Exception ex) {  
44:   }    
45:  
46:   // リストに設定する リストをアダプター化    
47: myAdapter = new ArrayAdapter(this,  
48:   android.R.layout.test_list_item, // 表示レイアウト    
49: android.R.id.text1, // TextViewのID  
50:   myMemo); // 表示するArrayList    
51: setListAdapter(myAdapter);  
52:   }    
53:  
54:   /**    
55:  * Saveボタン押下時のイベント  
56:    */    
57: private OnClickListener saveClick = new OnClickListener() {  
58:   @Override    
59: public void onClick(View v) {  
60:   Log.d("MemoSample", "saveClick onClick");    
61: String memo = myMemoEdit.getText().toString(); // 入力テキスト内容  
62:   memo = memo.replaceAll(NEW_LINE_CODE, ""); // 改行削除    
63:  
64:   try {    
65: myMemo.add(memo); // リストにメモを追加  
66:   saveMemo(myMemo); // メモをファイルに保存    
67: myAdapter.notifyDataSetChanged(); // 表示リスト更新  
68:   } catch (Exception ex) {    
69: Log.d("MemoSample", ex.toString());  
70:   }    
71: myMemoEdit.setText(""); // 初期化  
72:   }    
73: };  
74:    
75: /**  
76:    * リストから要素を削除    
77:  */  
78:   public void onListItemClick(ListView l, View v, int position, long id) {    
79: myMemo.remove(position); // リストから要素削除  
80:   try {    
81: saveMemo(myMemo); // メモファイルの保存  
82:   } catch (Exception ex) {    
83:  
84:   }    
85: myAdapter.notifyDataSetChanged(); // リスト更新  
86:   }    
87:  
88:   /**    
89:  * リスト内容をファイル出力  
90:    */    
91: private void saveMemo(final ArrayList memo) throws Exception {  
92:   FileOutputStream fo = null;    
93: BufferedWriter bw = null;  
94:   try {    
95: fo = openFileOutput(MEMO_FILE_NAME, MODE_PRIVATE);  
96:   bw = new BufferedWriter(new OutputStreamWriter(fo));    
97: for (String line : memo) {  
98:   bw.write(line);    
99: bw.newLine();  
100:   }    
101: } finally {  
102:   bw.flush();    
103: bw.close();  
104:   fo.close();    
105: }  
106: }    
107:  
108: /**    
109:  * ファイル読み込み  
110:  */    
111: private void readFile(String fileName) throws Exception {  
112:   FileInputStream fi = null;    
113: BufferedReader br = null;  
114:   try {    
115: fi = openFileInput(fileName);  
116:   br = new BufferedReader(new InputStreamReader(fi));    
117: String line = "";  
118:   while ((line = br.readLine()) != null) {    
119: myMemo.add(line);  
120:   }    
121: } finally {  
122:   br.close();    
123: fi.close();  
124:   }    
125: }  
126: }    
127:                                              
①メモ出力シュツリョクのためのイベントをボタンへ設定セッテイ
保存ホゾンしているメモファイルの
③リストした内容ナイヨウをアダプター表示ヒョウジする
④ボタンクリックにより、入力ニュウリョクした内容ナイヨウをメモファイルへ出力シュツリョク
⑤notifyDataSetChanged()でリストを最新サイシン状態ジョウタイにする
内容ナイヨウをメモファイルへ出力シュツリョクする。
画面ガメンレイアウト
・テキストを入力ニュウリョクEditTextとButtonオブジェクト
 内容ナイヨウ出力シュツリョクするうListViewを配置ハイチする。
○main.xml
1:                              
2:    
3:     android:orientation="vertical"  
4:     android:layout_width="fill_parent"    
5:     android:layout_height="fill_parent"  
6:     >    
7:  
8:   android:orientation="horizontal"    
9: android:layout_width="fill_parent"  
10:   android:layout_height="wrap_content"    
11: android:background="#777777"  
12:   android:padding="5dp">    
13:  
14:       android:layout_width="wrap_content"    
15:     android:layout_height="wrap_content"  
16:       android:layout_weight="1"    
17:     android:lines="2"  
18:       android:text="Memo"    
19:     />  
20:       
21:     android:layout_width="wrap_content"  
22:       android:layout_height="fill_parent"    
23:     android:text="Save" />  
24:        
25:      
26:       android:layout_width="fill_parent"    
27:     android:layout_height="wrap_content"  
28:       android:padding="5dp"    
29:     />  
30:    
31:                                                
データを提供テイキョウするメモアプリ(内容ナイヨウ転送テンソウガワ
今回コンカイのメインとなるContentProviderを継承ケイショウするクラスです。
 メモアプリで生成セイセイしたメモファイルを転送テンソウするため、openFileメソッドを実装ジッソウします。
 それ以外イガイのメソッドは、今回コンカイ利用リヨウしないためカラ実装ジッソウとする。
○MemoProvider ContentProviderクラス
1: package android.memo.sample;                                  
2:    
3: import java.io.File;  
4: import java.io.FileNotFoundException;    
5:  
6: import android.content.ContentProvider;    
7: import android.content.ContentValues;  
8: import android.database.Cursor;    
9: import android.net.Uri;  
10: import android.os.ParcelFileDescriptor;    
11:  
12: public class MemoProvider extends ContentProvider {    
13:  
14:   /**    
15:  * ファイルを共有するopenFile  
16:    */    
17: @Override  
18:   public ParcelFileDescriptor openFile(Uri uri, String mode)      
19: throws FileNotFoundException {  
20:   File f = getContext().getFileStreamPath(MemoSample.MEMO_FILE_NAME);    
21: // Androidアプリ間でオブジェをやり取りする専用クラス  
22:   ParcelFileDescriptor parcel = ParcelFileDescriptor.open(f,      
23: ParcelFileDescriptor.MODE_READ_ONLY);  
24:   return parcel;    
25: }  
26:    
27: /**  
28:    * 以下メソッドは利用しないため空実装    
29:  */  
30:   @Override    
31: public boolean onCreate() {  
32:   return false;    
33: }  
34:    
35: @Override  
36:   public Cursor query(Uri uri, String[] projection, String selection,    
37: String[] selectionArgs, String sortOrder) {  
38:   return null;    
39: }  
40:    
41: @Override  
42:   public int delete(Uri uri, String selection, String[] selectionArgs) {    
43: return 0;  
44:   }    
45:  
46:   @Override    
47: public int update(Uri uri, ContentValues values, String selection,  
48:   String[] selectionArgs) {    
49: return 0;  
50:   }    
51:  
52:   @Override    
53: public Uri insert(Uri uri, ContentValues values) {  
54:   return null;    
55: }  
56:    
57: @Override  
58:   public String getType(Uri uri) {    
59: return null;  
60:   }    
61: }  
62:                                                
①ファイルを転送テンソウするopenFileメソッドを実装ジッソウする
転送テンソウ対象タイショウはMemoSample.MEMO_FILE_NAME
③ParcelFileDescriptorとは、Androidアプリカンでオブジェクトをやりりする
 専用センヨウのクラスです。
■マニフェストファイル
・ContentProviderを利用リヨウすることをマニフェストファイルへ明記メイキする。
○マニフェストファイル
1:   ・・・省略ショウリャク・・・                                      
2:      
3:   ・・・省略ショウリャク・・・                                      
・android:nameにクラスメイ、authoritiesには、ContentProviderを利用リヨウするサイのURIを指定シテイする。
画面ガメンイメージ
入力ニュウリョクした文字列モジレツをファイルへ出力シュツリョクするアプリです。
データをすアプリ            
上記ジョウキ作成サクセイしたContentProviderからデータを取得シュトクし、リスト表示ヒョウジする。
○MemoViewerアクティビティクラス
1: package android.memo.viewer;                                  
2:    
3: import java.io.BufferedReader;  
4: import java.io.FileNotFoundException;    
5: import java.io.IOException;  
6: import java.io.InputStream;    
7: import java.io.InputStreamReader;  
8: import java.util.ArrayList;    
9: import android.app.ListActivity;  
10: import android.net.Uri;    
11: import android.os.Bundle;  
12: import android.os.ParcelFileDescriptor;    
13: import android.os.ParcelFileDescriptor.AutoCloseInputStream;  
14: import android.widget.ArrayAdapter;    
15: import android.widget.ListAdapter;  
16:    
17: public class MemoViewer extends ListActivity {  
18:    
19: @Override  
20:   public void onCreate(Bundle savedInstanceState) {    
21: super.onCreate(savedInstanceState);  
22:   setContentView(R.layout.main);    
23: ArrayList list = null;  
24:   ParcelFileDescriptor fd = null;    
25: AutoCloseInputStream is = null;  
26:   try {    
27: Uri uri = Uri.parse("content://android.memo.sample");  
28:   // メモ情報を取得    
29: fd = getContentResolver().openFileDescriptor(uri, null);  
30:   is = new AutoCloseInputStream(fd); // InputStreamを取得      
31: list = readFile(is);  
32:   setList(list.toArray(new String[0]));    
33: } catch (Exception ex) {  
34:   ex.printStackTrace();    
35: } finally {  
36:   try {    
37: is.close();  
38:   fd.close();    
39: } catch (Exception ex) {  
40:   }    
41: }  
42:   }    
43:  
44:   private ArrayList readFile(InputStream stream)    
45: throws FileNotFoundException, IOException {  
46:   BufferedReader br = null;    
47: try {  
48:   br = new BufferedReader(new InputStreamReader(stream));    
49: ArrayList list = new ArrayList();  
50:   String line = null;    
51: while ((line = br.readLine()) != null) {  
52:   list.add(line);    
53: }  
54:   return list;    
55: } finally {  
56:   br.close();    
57: }  
58:   }    
59:  
60:   /**    
61:  * String配列をリスト表示  
62:    */    
63: private void setList(String[] strs) {  
64:   ListAdapter adapter = new ArrayAdapter(this,    
65: android.R.layout.test_list_item, android.R.id.text1, strs);  
66:   setListAdapter(adapter);    
67: }  
68: }    
69:                                                
①データの提供テイキョウモトをUriで定義テイギ。マニフェストファイルに記述キジュツしたUriを指定シテイする
②openFileDescriptorでopenFileメソッドがカエすParcelFileDescriptorを取得シュトク
③ファイルの内容ナイヨウをInputStream形式ケイシキ取得シュトク
内容ナイヨウをリストで表示ヒョウジする
画面ガメンイメージ
実行ジッコウ結果ケッカです。
・ContentProviderを利用リヨウし、メモアプリで作成サクセイしているファイルの内容ナイヨウ取得シュトクします。
 その内容ナイヨウをリストして表示ヒョウジします。
以上イジョウがContentProviderを利用リヨウしたデータ提供テイキョウアプリとなります。
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。
スポンサーサイト

テーマ : android
ジャンル : コンピュータ

コメントの投稿

非公開コメント

おすすめアプリ
カテゴリ
最新記事
リンク
アクセスカウンター
アクセス解析
imobile
i-mobile
i-mobile
i-mobile
i-mobile
i-mobile
検索フォーム
RSSリンクの表示
リンク
ブロとも申請フォーム

この人とブロともになる

QRコード
QR
Amazon
Androidお勧め参考書
EC studio
商品
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。