-1

SD カードに保存された画像を取得しようとすると、いくつかの問題が発生します。

基本的に、画像を撮影するときに使用しているコードは次のとおりです。

    if(now==null){

            SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmm");
            now = sdf.format(new Date());
        }

        myDirVids=new File(Environment.getExternalStorageDirectory()+"/TimelapseVideos");
        if(!myDirVids.exists()){
            myDirVids.mkdirs();
        }
        myDirPhotos=new File(Environment.getExternalStorageDirectory()+"/TimelapsePhotos");
        if(!myDirPhotos.exists()){
            myDirPhotos.mkdirs();
        }

        myDir=new File(myDirPhotos+"/timelapse"+now);
        myDir.mkdirs();
        DecimalFormat decimalFormat = new DecimalFormat("00000");
        imagename = "Image-"+ decimalFormat.format(num) +".jpg";
        file = new File (myDir, imagename);
        if (file.exists ()) file.delete (); 
        try {
            FileOutputStream fos = new FileOutputStream(file);

            fos.write(data);
            fos.close();

        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

この行の直後に、保存された画像を取得しようとしましたが、利用できないように見えるため、NullPointerException が発生しています。

    Log.d(TAG, file.getAbsolutePath());
    Log.d(TAG, imagename);

try { 
Thread.sleep(800); 
} catch (InterruptedException e) {              
e.printStackTrace();
}

最初の行で nullPointerException を取得し、Log.d(TAG, file.getAbsolutePath());

しかし、この行をスリープ後に配置すると、nullPointerException はスローされません。エラーが発生しないようにするには、スリープを 500 ミリ秒以上にする必要があります。

問題の原因はわかりませんが、FileOutPutStream 操作が終了しても、スマートフォンはまだデータを SD カードに保存していると思います。電話をしばらく(0.5〜1秒)放置すると、書き込みプロセスが終了したため、問題はなくなります。

私の質問は:

書き込み操作がいつ終了するかを知る方法はありますか?

4

2 に答える 2

1

わかりました、私はついに私の問題を解決しました。

先ほど言ったように、保存したばかりの画像にアクセスしようとすると NullPointerException が発生しました。それを保存した後(および500ミリ秒の間)、「ファイル」変数はnullです(何らかの理由でわかりません)。

したがって、ファイルが null でない場合を知るために、次の行を追加しました。

while(file==null){}

//retrieve file

お時間をいただきありがとうございます。

于 2013-08-28T09:14:00.677 に答える
1

ファイルが存在するかどうかを確認するには、次のことができます-

File file = new File(getExternalCacheDirectory(), YOUR_FILE_NAME);
if (file.exists()) {
  // Exists
} else {
  // Doesn't exist
}

また、MediaScannerConnectionを使用してファイルをスキャンすることもできます。

于 2013-08-27T15:46:48.897 に答える