重複ファイルを見つけるためのAndroidアプリを開発しています。今まで私はディレクトリエクスプローラーアクティビティを開発しました。ユーザーはこのアクティビティを通じてディレクトリを選択します。次に、別のプロセスでサービスを開始して、そのディレクトリ内のすべてのファイルをリストし(DFSアルゴリズムを使用)、それらの間ですべての重複を検索します。
今のところ、そのディレクトリとそのサブディレクトリ内のすべてのファイルのリストを別々のアクティビティで表示したいと思います。ArrayListを使用してファイルオブジェクトを保持しており、このArrayListをこのサービスからActivityに渡したいと考えています。ArrayListをサービスのファイル「filelist.bin」に書き込んでいて、アクティビティからそのファイルを読み取りたいのですが、ここでエラーが発生します。。
また、アクティビティを起動するために、すべてのファイルの一覧表示とArrayListへの追加が完了したときにサービスによってスローされる通知を使用しています。
ファイルを読み込もうとすると、Resourcenotfound例外が発生します。すべてのエラーの詳細は最後にリストされています。
以下は参考のためのコードです(サービスコード)
public class BgService extends Service {
static String DIR0;
//public static ArrayList<FileX> OnlyFiles = new ArrayList<FileX>();
public static Stack<File> dirStack = new Stack<File>();
public static File file0;
public static File[] filearray;
static int size=0;
static FileX file2;
public static ArrayList<File> sOnlyFiles = new ArrayList<File>();
ArrayList<File> ListoFile;
static String hash1,hash2;
static ArrayList<Integer> Index2Del= new ArrayList<Integer>();
ArrayList<FileX> localOF;
FileOutputStream fos ;
FileInputStream fis;
ObjectOutputStream obs;
ObjectInputStream obsi;
@Override
public void onCreate() {
// TODO Auto-generated method stub
//Toast.makeText(getApplicationContext(), "service created",5000).show();
super.onCreate();
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
DIR0 = new String( intent.getCharArrayExtra("dir0"));
listAllfiles();
Collections.sort(sOnlyFiles, SizeFileComparator.SIZE_COMPARATOR);
serializeList();
//deserializeList();
/*
int size = ListoFile.size();
for(int i = 0;i<size;i++){
Toast.makeText(getApplicationContext(),String.valueOf(ListoFile.get(i).length()),1000).show();
}*/
displayNotification();
this.stopSelf();
return super.onStartCommand(intent, flags, startId);
}
@Override
public void onDestroy() {
// TODO Auto-generated method stub
//Toast.makeText(getApplicationContext(), "service destroyed",5000).show();
super.onDestroy();
}
public void listAllfiles(){
dirStack.push(new File(DIR0));
while(dirStack.size()!=0){
file0 = dirStack.pop();
filearray=file0.listFiles();
for(File lookFile : filearray){
if(lookFile.isFile() && lookFile.canRead()){
sOnlyFiles.add(lookFile);
DataHolder.Dcounter++;
}
else if(lookFile.isDirectory()&& lookFile.canRead()){
dirStack.push(lookFile);
}
}
}
}
public void serializeList() {
String filename = "filelist.bin";
File dir = getDir("DFR", MODE_PRIVATE);
try {
Resources res = Resources.getSystem();
fos = openFileOutput(filename, MODE_PRIVATE);
obs = new ObjectOutputStream(fos);
obs.writeObject(sOnlyFiles);
obs.flush();
obs.close();
fos.close();
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public void displayNotification(){
NotificationManager nm = (NotificationManager)getSystemService(getApplicationContext().NOTIFICATION_SERVICE);
Intent i = new Intent(getApplicationContext(),AllFiles.class);
// Bundle listfile = new Bundle();
//listfile.putStringArrayList("listfile", sOnlyFiles);
//i.putExtra(name, value)
//i.putExtra("filelist", sOnlyFiles);
PendingIntent pi = PendingIntent.getActivity(getApplicationContext(), 0, i, PendingIntent.FLAG_CANCEL_CURRENT);
Notification nf = new Notification(R.drawable.ic_launcher,"Duplicate File Remover\n"+ DataHolder.Dcounter+" files found",System.currentTimeMillis());
nf.setLatestEventInfo(getApplicationContext(), "Duplicate File Remover", DataHolder.Dcounter+" files found",pi);
nf.vibrate = new long[]{100,250,100,500};
nm.notify(1,nf);
}
@Override
public IBinder onBind(Intent intent) {
// TODO Auto-generated method stub
return null;
}
}
(活動規範)
public class AllFiles extends ListActivity{
FileInputStream fis ;
ObjectInputStream obs;
public static ArrayList<File> ListoFiles;
@Override
protected void onCreate(Bundle savedInstanceState) {
stopService(new Intent(this, BgService.class));
deserializeList();
// stopService(new Intent(this, BgService.class));
//setListAdapter(new OnlyFilesAdapter());
//Bundle filelist = getIntent().getExtras();
super.onCreate(savedInstanceState);
}
public void deserializeList(){
Object tolist =null;
String filename = "filelist.bin";
try {
fis = openFileInput(filename);
if(fis!=null){
obs = new ObjectInputStream(fis);
tolist = obs.readObject();
@SuppressWarnings("unchecked")
ArrayList<File> tolist2 = (ArrayList<File>)tolist;
ListoFiles = tolist2;
obs.close();
fis.close();
Toast.makeText(getApplicationContext(), ListoFiles.size(), 5000).show();
}else
Toast.makeText(getApplicationContext(), "file not available", 2000).show();
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
エラー時のLogCat値:-
10-14 13:30:33.018:W / ResourceType(433):リソース番号0x0000001bの値を取得するときにパッケージ識別子がありません 10-14 13:30:33.070:D / AndroidRuntime(433):VMをシャットダウンしています 10-14 13:30:33.070:W / dalvikvm(433):threadid = 1:キャッチされない例外でスレッドが終了します(group = 0x40015560) 10-14 13:30:33.269:E / AndroidRuntime(433):致命的な例外:メイン 10-14 13:30:33.269:E / AndroidRuntime(433):java.lang.RuntimeException:アクティビティを開始できませんComponentInfo {my.com.filebrowser / my.com.filebrowser.AllFiles}:android.content.res.Resources $ NotFoundException:文字列リソースID#0x1b 10-14 13:30:33.269:E / AndroidRuntime(433):android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1647) 10-14 13:30:33.269:E / AndroidRuntime(433):android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1663) 10-14 13:30:33.269:E / AndroidRuntime(433):android.app.ActivityThread.access $ 1500(ActivityThread.java:117) 10-14 13:30:33.269:E / AndroidRuntime(433):android.app.ActivityThread $ H.handleMessage(ActivityThread.java:931) 10-14 13:30:33.269:E / AndroidRuntime(433):android.os.Handler.dispatchMessage(Handler.java:99) 10-14 13:30:33.269:E / AndroidRuntime(433):android.os.Looper.loop(Looper.java:123) 10-14 13:30:33.269:E / AndroidRuntime(433):android.app.ActivityThread.main(ActivityThread.java:3683) 10-14 13:30:33.269:E / AndroidRuntime(433):java.lang.reflect.Method.invokeNative(ネイティブメソッド) 10-14 13:30:33.269:E / AndroidRuntime(433):java.lang.reflect.Method.invoke(Method.java:507)で 10-14 13:30:33.269:E / AndroidRuntime(433):com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:839) 10-14 13:30:33.269:E / AndroidRuntime(433):com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597) 10-14 13:30:33.269:E / AndroidRuntime(433):dalvik.system.NativeStart.main(ネイティブメソッド) 10-14 13:30:33.269:E / AndroidRuntime(433):原因:android.content.res.Resources $ NotFoundException:文字列リソースID#0x1b 10-14 13:30:33.269:E / AndroidRuntime(433):android.content.res.Resources.getText(Resources.java:201) 10-14 13:30:33.269:E / AndroidRuntime(433):android.widget.Toast.makeText(Toast.java:258) 10-14 13:30:33.269:E / AndroidRuntime(433):my.com.filebrowser.AllFiles.deserializeList(AllFiles.java:60) 10-14 13:30:33.269:E / AndroidRuntime(433):my.com.filebrowser.AllFiles.onCreate(AllFiles.java:34) 10-14 13:30:33.269:E / AndroidRuntime(433):android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047) 10-14 13:30:33.269:E / AndroidRuntime(433):android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1611) 10-14 13:30:33.269:E / AndroidRuntime(433):...11詳細