Java 如何在SD中设置有上限的最大目录存储空间?

Java 如何在SD中设置有上限的最大目录存储空间?,java,android,video,service,camera,Java,Android,Video,Service,Camera,假设我只想分配1GB的空间将我的视频存储在一个特定的文件目录中,当它即将达到/达到1GB时,如何自动删除该目录中最旧的视频文件 对不起,我是java/android新手,目前正在创建一个汽车黑盒应用程序,有人能帮我吗。。。谢谢 这就是我迄今为止所尝试的。有人能告诉我,我应该如何在我的CameraTest活动中实现上述功能: public class CameraTest extends Activity implements SurfaceHolder.Callback, OnClickList

假设我只想分配1GB的空间将我的视频存储在一个特定的文件目录中,当它即将达到/达到1GB时,如何自动删除该目录中最旧的视频文件

对不起,我是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();
    }
}
my 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;
}
}

要获取目录的当前大小,您需要使用
length()
方法将目录中每个单独文件的大小相加。这是您在这方面要查找的内容。然后,您可以检查大小是否超过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();
File directory=new File(*表示目录*的绝对路径的字符串);
File[]files=目录.listFiles();
Arrays.sort(文件,新的Comparator(){
@凌驾
公共整数比较(文件f1、文件f2){
返回Long.valueOf(f1.lastModified()).compareTo(f2.lastModified());
}
});
文件[0]。删除();
这段代码获取数组中的所有文件,并根据它们的修改/创建日期对它们进行排序。然后数组中的第一个文件是最旧的文件,因此您只需将其删除即可


将其放入代码中的最佳位置是当您要将某些内容写入目录时。首先执行此检查和删除,然后如果大小小于1 GB,则写入目录,否则删除另一个文件。

这里的链接如何更适合获取目录的大小?-->如果是这样,我仍然是kinna lost如何将上述代码实现到我的源代码中:(这两篇文章中的两种解决方案都是相同的方法,因此您可以使用其中任何一种。根据MediaPlayer API文档,在放置此代码的位置上:您需要在准备()和启动()之前设置OutputFile(路径名)。因此,在startRecording()方法中添加setOutputFile(路径名)之前,您应该先添加我的检查。对于我的案例,这里的“目录绝对路径字符串”是什么?我是android中的新成员。在您的案例中,它是您要将其保存到的目录,因此它是“/mnt/sdcard/”+目录的名称您应该尝试使用getExternalStorageDirectory()方法。这将为您提供一个路径,然后您可以添加要保存它的文件夹的名称。