2015-03-11 2 views
2

Я пытаюсь добавить текст в текстовый файл на Google Диске. Но когда я пишу, весь файл перезаписывается. Почему я не могу просто добавить текст в конец файла?Не удалось добавить текст в файл Google Диска

DriveFile file = Drive.DriveApi.getFile(mGoogleApiClient, id); 
    file.open(mGoogleApiClient, DriveFile.MODE_WRITE_ONLY, null).setResultCallback(new ResultCallback<DriveApi.DriveContentsResult>() { 
     @Override 
      public void onResult(DriveApi.DriveContentsResult driveContentsResult) { 
        msg.Log("ContentsOpenedCallBack"); 

        if (!driveContentsResult.getStatus().isSuccess()) { 
        Log.i("Tag", "On Connected Error"); 
        return; 
        } 

        final DriveContents driveContents = driveContentsResult.getDriveContents(); 

        try { 
        msg.Log("onWrite"); 
        OutputStream outputStream = driveContents.getOutputStream(); 
        Writer writer = new OutputStreamWriter(outputStream); 
        writer.append(et.getText().toString()); 
        writer.close(); 
        driveContents.commit(mGoogleApiClient, null); 

        } catch (IOException e) { 
        e.printStackTrace(); 
        } 
      } 

}); 
+0

Вы нашли решение? Как вы это решили? – Christian

+0

Еще не удалось найти решение. Если вы получите случайно, сообщите мне. – Gaj

+0

Я нашел ответ. Посмотрите – Gaj

ответ

2

И наконец, я нашел ответ, чтобы добавить текст в документе привода.

DriveContents contents = driveContentsResult.getDriveContents(); 

try { 

     String input = et.getText().toString(); 

     ParcelFileDescriptor parcelFileDescriptor = contents.getParcelFileDescriptor(); 
     FileInputStream fileInputStream = new FileInputStream(parcelFileDescriptor 
          .getFileDescriptor()); 

     // Read to the end of the file. 

    fileInputStream.read(new byte[fileInputStream.available()]); 


     // Append to the file. 
     FileOutputStream fileOutputStream = new FileOutputStream(parcelFileDescriptor 
          .getFileDescriptor()); 
     Writer writer = new OutputStreamWriter(fileOutputStream); 
     writer.write("\n"+input); 

     writer.close(); 
     driveContentsResult.getDriveContents().commit(mGoogleApiClient, null); 

} catch (IOException e) { 
        e.printStackTrace(); 
    } 

SO

+0

Представьте, что у вас есть файл с 500 МБ ... Когда вы делаете «fileInputStream.read (новый байт [fileInputStream.available()]);», он читает только «последний байт» или читает весь файл содержание? – Christian

+0

Все еще я не играл с ним. Но для этой строки 'fileInputStream.read (новый байт [fileInputStream.available()]);' Я думаю, что он читает все содержимое файла и преобразуется в байты для записи в конце. Для получения дополнительной информации ознакомьтесь с этой [ссылкой] (https://developers.google.com/drive/android/files). – Gaj

+0

ok ... звучит так, будто вы не добавляете в конец файла ... вы «переписываете» все ... если у нас есть файл размером 2 ГБ, я думаю, что это невозможно сделать таким образом. – Christian

0

Причина в том, что стратегия решения по умолчанию для фиксации - это перезапись существующих файлов. Проверьте API docs и посмотрите, есть ли способ добавить изменения.

0

Для тех, кто сталкивается с этой проблемой в 2017 году: Google имеет некоторые методы для добавления данных Вот a link!

Хотя копирование метод из Google не работал совсем для меня, так вот это класс, который будет добавлять данные: (Пожалуйста, обратите внимание, что это модифицированная версия этого кода link)

import java.io.FileInputStream; 
import java.io.FileOutputStream; 
import java.io.IOException; 
import java.io.OutputStream; 
import java.io.OutputStreamWriter; 
import java.io.Writer; 

import android.content.Context; 
import android.content.SharedPreferences; 
import android.os.Bundle; 
import android.os.ParcelFileDescriptor; 
import android.preference.PreferenceManager; 
import android.util.Log; 

import com.google.android.gms.common.api.Result; 
import com.google.android.gms.common.api.ResultCallback; 
import com.google.android.gms.drive.Drive; 
import com.google.android.gms.drive.DriveApi.DriveContentsResult; 
import com.google.android.gms.drive.DriveApi.DriveIdResult; 
import com.google.android.gms.drive.DriveContents; 
import com.google.android.gms.drive.DriveFile; 
import com.google.android.gms.drive.DriveId; 

/** 
* An activity to illustrate how to edit contents of a Drive file. 
*/ 
public class EditContentsActivity extends BaseDemoActivity { 

private static final String TAG = "EditContentsActivity"; 

@Override 
public void onConnected(Bundle connectionHint) { 
    super.onConnected(connectionHint); 

    final ResultCallback<DriveIdResult> idCallback = new ResultCallback<DriveIdResult>() { 
     @Override 
     public void onResult(DriveIdResult result) { 
      if (!result.getStatus().isSuccess()) { 
       showMessage("Cannot find DriveId. Are you authorized to view this file?"); 
       return; 
      } 
      DriveId driveId = result.getDriveId(); 
      DriveFile file = driveId.asDriveFile(); 
      new EditContentsAsyncTask(EditContentsActivity.this).execute(file); 
     } 
    }; 
    SharedPreferences sp= PreferenceManager.getDefaultSharedPreferences(EditContentsActivity.this); 
    Drive.DriveApi.fetchDriveId(getGoogleApiClient(), EXISTING_FILE_ID) 
      .setResultCallback(idCallback); 
} 

public class EditContentsAsyncTask extends ApiClientAsyncTask<DriveFile, Void, Boolean> { 

    public EditContentsAsyncTask(Context context) { 
     super(context); 
    } 

    @Override 
    protected Boolean doInBackgroundConnected(DriveFile... args) { 
     DriveFile file = args[0]; 
     SharedPreferences sp=PreferenceManager.getDefaultSharedPreferences(EditContentsActivity.this); 
     System.out.println("0"+sp.getString("drive_id","1")); 
     DriveContentsResult driveContentsResult=file.open(getGoogleApiClient(), DriveFile.MODE_READ_WRITE, null).await(); 
       System.out.println("1"); 
     if (!driveContentsResult.getStatus().isSuccess()) { 
      return false; 
     } 
     DriveContents driveContents = driveContentsResult.getDriveContents(); 
       try { 
        System.out.println("2"); 
        ParcelFileDescriptor parcelFileDescriptor = driveContents.getParcelFileDescriptor(); 
        FileInputStream fileInputStream = new FileInputStream(parcelFileDescriptor 
          .getFileDescriptor()); 
        // Read to the end of the file. 
        fileInputStream.read(new byte[fileInputStream.available()]); 
        System.out.println("3"); 
        // Append to the file. 
        FileOutputStream fileOutputStream = new FileOutputStream(parcelFileDescriptor 
          .getFileDescriptor()); 
        Writer writer = new OutputStreamWriter(fileOutputStream); 
        writer.write("hello world"); 
        writer.close(); 
        System.out.println("4"); 
        driveContents.commit(getGoogleApiClient(), null).await(); 
        return true; 
       } catch (IOException e) { 
        e.printStackTrace(); 
       } 
      return false; 
     }; 








    @Override 
    protected void onPostExecute(Boolean result) { 
     if (!result) { 
      showMessage("Error while editing contents"); 
      return; 
     } 
     showMessage("Successfully edited contents"); 
    } 
} 
} 

Existing_File_id является идентификатор ресурса. Вот одна ссылка, если вам нужен идентификатор ресурса a link