Android 自アプリのデータを参照

Android 実機の /data の中は、エミュレータで見ることはできない。
デバッグのために、エクスプローラのように /data/data/パッケージ名/ の下が確認できたら良いのにと考えた。

そこで、File # listFiles() の結果で見に行くActivity を書いてみた。

import java.io.File;
import java.text.NumberFormat;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ImageButton;
import android.widget.ListView;
import android.widget.SimpleAdapter;
import android.widget.TextView;
//
public class ExplorerActivity extends Activity{
   // TARGET_PATH = 表示対象ディレクトリを Intent で受信するキー
   public final static String TARGET_PATH = "targetDirPath";   
   private final static String KEY_ICON = "icon";
   private final static String KEY_NAME = "filename";
   private final static String KEY_PATH = "filepath";
   private final static String KEY_ISDIRECTORY = "isDirectory";
   private final static String KEY_DATETIME = "fileDate";
   private final static String KEY_SIZE = "fileSize";
   private final static SimpleDateFormat sdateFormat = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");
   private NumberFormat numberFormat;

   @Override
   protected void onCreate(Bundle savedInstanceState){
      super.onCreate(savedInstanceState);
      setTitle("Explorer");
      setContentView(R.layout.explorerlist);
      // ファイルサイズ表示フォーマット
      numberFormat = NumberFormat.getInstance();
      numberFormat.setMaximumFractionDigits(3);

      String targetPath = getIntent().getExtras().getString(TARGET_PATH);
      
      final File file = new File(targetPath);
      List<Map<String,Object>> list = new ArrayList<Map<String,Object>>();
      for(File f : file.listFiles()){
         list.add(getItem(f));
      }
      // ボタン
      ImageButton upbutton = (ImageButton)findViewById(R.id.upDirButton);
      upbutton.setOnClickListener(new View.OnClickListener(){
         @Override
         public void onClick(View v){
            finish();
         }
      });
      // パス表示
      *1.setText(file.getAbsolutePath()+"/");

      // リスト表示
      ListView listview = (ListView)findViewById(R.id.explorerlistView);
      listview.setAdapter(new SimpleAdapter(this,list,R.layout.explorerlist_row
         ,new String{KEY_ICON,KEY_NAME,KEY_DATETIME,KEY_SIZE}
         ,new int
{R.id.folderOrFileImageView,R.id.fileNameTextView,R.id.fileDateTextView,R.id.fileSizeTextView}
      ));

      listview.setOnItemClickListener(new AdapterView.OnItemClickListener(){
         @Override
         public void onItemClick(AdapterView<?> parent,View view,int position,long id){
            ListView listView = (ListView)parent;
            @SuppressWarnings("unchecked")
            Map<String,Object> m = (Map<String,Object>)listView.getItemAtPosition(position);
            Boolean isdirectory = (Boolean)m.get(KEY_ISDIRECTORY);
            Intent intent = new Intent(ExplorerActivity.this,isdirectory ? ExplorerActivity.class : FileViewActivity.class);
            intent.putExtra(TARGET_PATH,m.get(KEY_PATH).toString());
            startActivity(intent);

         }
      });
   }
   private Map<String,Object> getItem(File file){
      Map<String,Object> map = new HashMap<String,Object>();
      map.put(KEY_ICON,file.isDirectory() ? R.drawable.foldericon : R.drawable.fileicon);
      map.put(KEY_NAME,file.getName());
      map.put(KEY_PATH,file.getPath());
      if (file.isDirectory()){
         map.put(KEY_DATETIME," ");
         map.put(KEY_SIZE," ");
      }else{
         map.put(KEY_DATETIME,sdateFormat.format(file.lastModified()));
         long size = file.length();
         if (size > 1024000){
            map.put(KEY_SIZE,numberFormat.format*2+" MB");
         }else{
            map.put(KEY_SIZE,numberFormat.format*3
);
      return map;
   }
}
-------------------------------------------------
そして、ファイルの中を参照するもの、、、

import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileInputStream;
import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.ImageButton;
import android.widget.TextView;
//
public class FileViewActivity extends Activity{
   @Override
   protected void onCreate(Bundle savedInstanceState){
      super.onCreate(savedInstanceState);
      setTitle("Explorer");
      setContentView(R.layout.fileview);

      String targetPath = getIntent().getExtras().getString(ExplorerActivity.TARGET_PATH);
      File file = new File(targetPath);
      // ボタン
      ImageButton upbutton = (ImageButton)findViewById(R.id.upDirButton);
      upbutton.setOnClickListener(new View.OnClickListener(){
         @Override
         public void onClick(View v){
            finish();
         }
      });

      // パス表示
      *4.setText(file.getAbsolutePath());
      
      // file テキスト表示
      ByteArrayOutputStream bos = new ByteArrayOutputStream();
      try{
      FileInputStream inputStream = new  FileInputStream(file);
      int n;
      while*5 != -1){
         bos.write(n);
      }
      inputStream.close();
      bos.close();

      *6.setText(new String(bos.toByteArray()));

      }catch(Exception e){
         Log.e("sample",e.getMessage(),e);
      }

   }
}

*1:TextView)findViewById(R.id.directoryTextView

*2:double)size / (1024 * 1024

*3:double)size / 1024)+" KB");
         }
      }
      map.put(KEY_ISDIRECTORY,new Boolean(file.isDirectory(

*4:TextView)findViewById(R.id.directoryTextView

*5:n=inputStream.read(

*6:TextView)findViewById(R.id.filetextView