2011-04-27 19 views
0

假設我只想分配1GB的空間來存儲我的視頻到一個特定的文件目錄,在這個目錄中它將如何自動刪除該目錄中最舊的視頻文件一旦達到/達到1GB?如何在SD中放置最大目錄存儲空間?

對不起,我kinna在Java/Android的新的和目前正在創建一個汽車黑匣子應用誰能幫我...謝謝

這是我到目前爲止已經試過有人可以告訴我,我應該如何實現上面提到的功能到我CameraTest活動:

public class CameraTest extends Activity implements SurfaceHolder.Callback, OnClickListener { 

    public static SurfaceView surfaceView; 
    public static SurfaceHolder surfaceHolder; 
    public static Camera MainCamera; 
    private static boolean previewRunning; 
    private static boolean serviceRunning = true; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 

     surfaceView = (SurfaceView)findViewById(R.id.surface_camera); 
     surfaceView.setOnClickListener(this); 

     surfaceHolder = surfaceView.getHolder(); 
     surfaceHolder.addCallback(this); 

     surfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS); 

     Button btnSetting = (Button) findViewById(R.id.button2); 
     btnSetting.setOnClickListener(new View.OnClickListener() 
     { 
      public void onClick(View v) 
      { 
       startActivity(new Intent(getApplicationContext(), SettingActivity.class)); 
      } 
     }); 
    } 

    @Override 
    public void onClick(View v) { 
     if (serviceRunning) 
     { 
      serviceRunning = false; 
      startService(new Intent(getApplicationContext(), ServiceRecording.class)); 
     } 
     else 
     { 
      serviceRunning = true; 
      stopService(new Intent(getApplicationContext(), ServiceRecording.class)); 
     } 
    } 

    public static boolean ServiceStatus; 
    public static String resParams; 

    @Override 
    public void surfaceCreated(SurfaceHolder holder) { 

     if(ServiceRecording.recordingStatus) 
     { 
      stopService(new Intent(getApplicationContext(), ServiceRecording.class)); 

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

      MainCamera = ServiceRecording.ServiceCamera; 

      startService(new Intent(getApplicationContext(), ServiceRecording.class));    
     } 

     else{ 

      MainCamera = Camera.open(); 

      if (MainCamera != null) { 

       resParams = MainCamera.getParameters().get("preview-size-values"); 

       Camera.Parameters params = MainCamera.getParameters(); 
       params.setPreviewSize(320, 240); 
       params.setPreviewFormat(PixelFormat.JPEG); 
       MainCamera.setParameters(params); 

       try { 
        MainCamera.setPreviewDisplay(holder); 
       } 

       catch (IOException e) 
       { 
        e.printStackTrace(); 
       } 
       MainCamera.startPreview(); 
       previewRunning = true; 
      } 
      else { 
       Toast.makeText(getApplicationContext(), "Camera not available!", Toast.LENGTH_LONG).show(); 
       finish(); 
      } 
     } 

     if (previewRunning) { 
      MainCamera.stopPreview(); 
     } 
    } 

    @Override 
    public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) { 

    } 

    @Override 
    public void surfaceDestroyed(SurfaceHolder holder){ 
     MainCamera.stopPreview(); 
     previewRunning = false; 
     MainCamera.release(); 
    } 
} 

我serviceRecording.java文件 公共類ServiceRecording延伸服務{

@Override 
public IBinder onBind(Intent intent) { 
    // TODO Auto-generated method stub 
    return null; 
} 

private SurfaceView surfaceView; 
private SurfaceHolder surfaceHolder; 
public static Camera ServiceCamera; 
public static boolean recordingStatus; 

@Override 
public void onCreate() { 
    super.onCreate(); 

    recordingStatus = false; 
    ServiceCamera = CameraTest.MainCamera; 
    surfaceView = CameraTest.surfaceView; 
    surfaceHolder = CameraTest.surfaceHolder; 
} 

@Override 
public int onStartCommand(Intent intent, int flags, int startId) { 
    super.onStartCommand(intent, flags, startId); 
    if (recordingStatus == false) 
    { 
     //new Timer().scheduleAtFixedRate(task, after, interval); 
     startRecording(); 
    } 

    return START_STICKY; 
} 

@Override 
public void onDestroy() { 
    super.onDestroy(); 

    stopRecording(); 
    //camera.stopPreview(); 
    recordingStatus = false; 
    //camera.release(); 
} 

private MediaRecorder mediaRecorder; 

private static int encodingType; 
private static String videoResolution; 
private static String fileFormat; 

private static boolean audioStatus; 
private static int timeInterval; 

private static final String TAG = "Exception"; 

public boolean startRecording(){ 
    try { 
      if(Tab1Activity.encodingPref == null) 
      { 
       encodingType = 1; 
      } 
      else 
      { 
       encodingType = Integer.parseInt(Tab1Activity.encodingPref); 
      } 
      //****************************************************************** 
      if(Tab1Activity.videoResPref == null) 
      { 
       String stringRes = CameraTest.resParams; 
       String[] entriesValues = stringRes.split(","); 
       videoResolution = entriesValues[0]; 
      } 
      else 
      { 
       videoResolution = Tab1Activity.videoResPref; 
      } 
      //****************************************************************** 
      if(Tab1Activity.fileFormatPref == null) 
      { 
       fileFormat = ".mp4"; 
      } 
      else 
      { 
       fileFormat = Tab1Activity.fileFormatPref; 
      } 
      //****************************************************************** 
      if(Tab2Activity.audioPref == false) 
      { 
       audioStatus = false; 
       //PreferenceManager.setDefaultValues(this, R.xml.tab2, true); 
      } 
      else 
      { 
       audioStatus = Tab2Activity.audioPref; 
      }  
      //****************************************************************** 

      Toast.makeText(getBaseContext(), "Recording Started", Toast.LENGTH_SHORT).show(); 
      try{ 
       ServiceCamera.reconnect(); 
       ServiceCamera.unlock(); 
      } 
      catch(Exception e){ 

      } 

      mediaRecorder = new MediaRecorder(); 

      mediaRecorder.setCamera(ServiceCamera); 

      if(audioStatus != true) 
      { 
       mediaRecorder.setAudioSource(MediaRecorder.AudioSource.MIC); 
      } 

      mediaRecorder.setVideoSource(MediaRecorder.VideoSource.CAMERA); 

      mediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.DEFAULT); 

      if(audioStatus != true) 
      { 
       mediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.DEFAULT); 
      } 

       mediaRecorder.setVideoEncoder(encodingType); 

       SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH_mm_ss"); 
       Date date = new Date(); 
       File dirlist = new File(Environment.getExternalStorageDirectory() + "/VideoList"); 

       if(!(dirlist.exists())) 
        dirlist.mkdir(); 

       File TempFile = new File(Environment.getExternalStorageDirectory() + "/VideoList", dateFormat.format(date) + fileFormat); 
       mediaRecorder.setOutputFile(TempFile.getPath()); 

       String[] separatedRes = videoResolution.split("x"); 
       mediaRecorder.setVideoSize(Integer.parseInt(separatedRes[0]),Integer.parseInt(separatedRes[1])); 

       mediaRecorder.setPreviewDisplay(surfaceHolder.getSurface()); 

       mediaRecorder.prepare(); 
       mediaRecorder.start(); 

       recordingStatus = true; 

       return true;       
    } 

    catch (IllegalStateException e) { 
     Log.d(TAG,e.getMessage()); 
     e.printStackTrace(); 
     return false; 
    } 
    catch (IOException e) { 
     Log.d(TAG,e.getMessage()); 
     e.printStackTrace(); 
     return false; 
    } 
} 

public void stopRecording() { 
    Toast.makeText(getBaseContext(), "Recording Stopped", Toast.LENGTH_SHORT).show(); 
    mediaRecorder.reset(); 
    mediaRecorder.release(); 

    recordingStatus = false; 
} 
} 

回答

0

要獲取目錄的當前大小,您需要使用length()方法將目錄中每個單獨文件的大小相加。 This article是你在這方面尋找的東西。然後您可以檢查大小是否超過1 GB。

來講自動刪除,你可以做以下的最古老的文件:

File directory = new File(*String for absolute path to directory*); 
File[] files = directory.listFiles(); 

Arrays.sort(files, new Comparator<File>() { 

    @Override 
    public int compare(File f1, File f2) { 

     return Long.valueOf(f1.lastModified()).compareTo(f2.lastModified()); 
    } 
}); 

file[0].delete(); 

這段代碼獲得陣列中的所有文件,並根據他們的修改/創建日期排序。然後,陣列中的第一個文件是最舊的文件,因此您可以直接刪除它。

將代碼放入代碼中的最佳位置是當您要將某些內容寫入目錄時。首先執行此檢查和刪除,然後如果大小小於1 GB,請寫入目錄,否則請刪除另一個文件。

+0

這裏的鏈接怎麼樣會更適合獲取目錄的大小? - > http://stackoverflow.com/questions/4040912/how-can-i-get-the-size-of-a-folder-on-sd-card-in-android如果是這樣,我仍然失去了kinna ( – zack 2011-04-30 14:29:35

+0

)這兩篇文章中的兩個解決方案都是相同的方法,所以您可以使用它。根據MediaPlayer API文檔的說明,在何處放置此代碼:http:///developer.android.com/reference/android/media/MediaRecorder.html 您需要在prepare()和start()之前設置setOutputFile(pathName)。因此,您應該在添加setOutputFile(pathName)之前添加我的支票。你的startRecording()方法 – 2011-04-30 15:14:12

+0

什麼是「目錄的絕對路徑的字符串」我的情況在這裏??我是在這裏的Android新手.. – zack 2011-05-01 08:26:38

相關問題