簡體   English   中英

將文件從應用程序內部存儲器復制到android中的外部存儲設備?

[英]Copy file from application Internal memory to external storage in android?

我有一個將數據保存到名為“ sensorLog.txt”的文件的應用程序。 我不確定確切存儲在哪里,但是我知道只能由應用程序訪問,並且它在內部存儲器中。

我希望能夠在單擊“導出”按鈕時將當前文件的副本寫入外部存儲。 我已經粘貼了程序的一小部分,但是我不確定如何將sensorLog.txt文件復制到外部存儲中。

    public class MainActivity extends Activity {

    private static final String DEBUG_TAG = "MainActivity";

    private Button buttonStartService;
    private Button buttonStopService;
    private Button buttonSettings;
    private Button buttonExport;

    private TextView textStatus;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        Context context = getApplicationContext();
        setContentView(R.layout.activity_main);

        buttonStartService = (Button) findViewById(R.id.button_start_service);
        buttonStopService = (Button) findViewById(R.id.button_stop_service);
        buttonSettings = (Button) findViewById(R.id.button_settings);
        buttonExport = (Button) findViewById(R.id.button_export);

        textStatus = (TextView) findViewById(R.id.text_status);


        buttonStartService.setOnClickListener(new View.OnClickListener() {
            public void onClick(View v) {
                startSensorService();
            }
        });

        buttonStopService.setOnClickListener(new View.OnClickListener() {
            public void onClick(View v) {
                stopSensorService();
            }
        });
        //export button listener

        buttonExport.setOnClickListener(export_handler);
    }

    public void startSensorService() {
        // Schedule
        AlarmManager scheduler = (AlarmManager) getSystemService(Context.ALARM_SERVICE);
        Intent intent = new Intent(getApplicationContext(), SensorService.class);
        PendingIntent scheduledIntent = PendingIntent.getService(getApplicationContext(), 0, intent, PendingIntent.FLAG_UPDATE_CURRENT);

        // 30 seconds
        long interval = 30 * 1000;

        scheduler.setInexactRepeating(AlarmManager.RTC_WAKEUP, System.currentTimeMillis(), interval, scheduledIntent);

        Log.d(DEBUG_TAG, "Service started");

    }

    public void stopSensorService() {
        // Cancel
        AlarmManager scheduler = (AlarmManager) getSystemService(Context.ALARM_SERVICE);
        Intent intent = new Intent(this, SensorService.class);
        PendingIntent scheduledIntent = PendingIntent.getService(getApplicationContext(), 0, intent, PendingIntent.FLAG_UPDATE_CURRENT);

        scheduler.cancel(scheduledIntent);
        Log.d(DEBUG_TAG, "Service stopped");

    }

    View.OnClickListener export_handler = new View.OnClickListener() {

        public void onClick(View v)
        {
            // Here is the part I am not sure what to do. I want to copy a file    sensorLog.txt that has all my sensor information to sd card

            String state = Environment.getExternalStorageState();

            if (Environment.MEDIA_MOUNTED.equals(state))
            {
                Log.d(DEBUG_TAG, "SD card detected");



            stopSensorService();

             File file = new File(Environment.getExternalStoragePublicDirectory(
                        Environment.DIRECTORY_DOCUMENTS),"SensorLog.txt");








             // delete file from the internal storage once exported
             context.deleteFile("SensorLog.txt");












            startSensorService();



        }
            else

            {
                Log.d(DEBUG_TAG, "No external storage detected(cannot copy file)");
            }
        }
    };

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.main, menu);
        return true;
    }

}

我在其中創建sensorLog.txt ***的部分(我認為沒有必要閱讀此問題,以防萬一有人需要它) *

private class SensorServiceLoggerTask extends AsyncTask<SensorFrame, Void, Void> {

        @Override
        protected Void doInBackground(SensorFrame... frames) {
            SensorFrame frame = frames[0];

            BufferedWriter bufWr = null;
            try {
                File file = new File(getApplicationContext().getFilesDir(), "SensorLog.txt");
                if (file.exists()) {
                    // Write to new file
                    bufWr = new BufferedWriter(new FileWriter(file, true));

                } else {
                    file.createNewFile();
                    Log.d(DEBUG_TAG, "New log file created");
                    // Append to existing file
                    bufWr = new BufferedWriter(new FileWriter(file, false));
                    // Write header
                    bufWr.append(sensorHeader.toString());
                }
                // Write frame
                bufWr.append(sensorFrame.toString());
                bufWr.flush();
                Log.d(DEBUG_TAG, "Added frame to log");
            } catch (IOException ex) {
                // TODO: useful error handling
            } finally {
                // Cleanup
                if (bufWr != null) {
                    try {
                        bufWr.close();
                    } catch (IOException ex) {
                        // TODO: useful error handling
                    }
                }
            }
            return null;
        }
    }

我還有2個查詢:

  1. 可以說我想在移動文件之前在文件頂部附加一些信息,我該怎么做?

  2. 我的目的是在按下導出按鈕時將sensorLog.txt文件從內部存儲傳輸到外部存儲。 刪除或清空內部sensorLog.txt文件,然后再次按Export會再次發生相同的事情,那么我正確導出文件時必須重命名文件嗎? 不會有名字沖突嗎? 我該如何處理? 我可以動態命名嗎?

謝謝。

編輯:一些更正

View.OnClickListener export_handler = new View.OnClickListener() {

        public void onClick(View v)
        {

            String state = Environment.getExternalStorageState();

            if (Environment.MEDIA_MOUNTED.equals(state))
            {
                Log.d(DEBUG_TAG, "SD card detected");



            stopSensorService();

                Log.d(DEBUG_TAG, "stopSensorService for file transfer");

                //make the timestamp the file name
                long TS = System.currentTimeMillis();
                StringBuilder stringBuilder = new StringBuilder();

                stringBuilder.append(TS);
                stringBuilder.append(".txt");

                String file_name = stringBuilder.toString();

                //file name stored in file_name


                File file_ext = new File(Environment.getExternalStoragePublicDirectory(
                        Environment.DIRECTORY_DOCUMENTS),file_name);


// attempt to create this new directory


//read from sensorLog.txt file
                try
                {
                    file_ext.createNewFile();

                    File file = getBaseContext().getFileStreamPath("sensorLog.txt");
                    if(file.exists())
                    {



                    FileInputStream read_file = openFileInput("sensorLog.txt");






                //read contents of internal file
                InputStreamReader inputStreamReader = new InputStreamReader(read_file);
                BufferedReader bufferedReader = new BufferedReader(inputStreamReader);
                StringBuilder sb = new StringBuilder();
                sb.append("Timestamp of export to SD"+TS+"/n");
                String line;
                while ((line = bufferedReader.readLine()) != null) {
                    sb.append(line);
                }
                BufferedWriter bufWr = null;

               bufWr = new BufferedWriter(new FileWriter(file_ext, false));



                // Write header
                bufWr.append(sb.toString());
                inputStreamReader.close();
                bufWr.close();
                read_file.close();




                //delete sensor file once exported
                getApplicationContext().deleteFile("sensorLog.txt");
                    }

            }

                catch(Exception e){}

但是由於某種原因,我的文件沒有存儲在SD卡中。

查看Android文檔 如果您可以讀取sensorLog.txt文件,則可以將其保存在字符串中,然后將字符串保存到外部存儲中的文件中。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM