使用Drive Rest API + Drive Android Api删除文件时出错。 drive.files()。删除(driveid.getResourceId())

时间:2014-03-25 16:10:47

标签: google-drive-api google-drive-android-api

驱动REST API + GDAA无法删除该文件。

通过此问题并发表评论 How to delete a file on google drive using Google Drive Android API ,但当我使用driveid.getResourceId();作为fileId参数传递给旧的Drive API service.files().delete()方法时给出错误:

Error Required parameteres must be passed it may lead to Dead Lock

我的代码:

public class MainActivity extends Activity implements ConnectionCallbacks,
    OnConnectionFailedListener {

private GoogleAccountCredential credential;
private static final int REQUEST_CODE_CREATOR = 2;
private static final int REQUEST_CODE_RESOLUTION = 3;
private static final int PICKFILE_RESULT_CODE = 1;
private static Uri fileUri;
private ContentsResult contentsresult;
private GoogleApiClient mGoogleApiClient;
byte[] buffer;
String EXISTING_FILE_ID = "";
int folderCreated = 0;
SharedPreferences prefs;
ArrayList<String> dbfileid = new ArrayList<String>();
ArrayList<String> dbfilename = new ArrayList<String>();

String fdd="";
DriveFolderResult sky;
private DriveId mFolderDriveId;
String isfolder;
SharedPreferences sp;
String Shared="Shared";
String folderid="";
SQLiteOpenHelper dbhelper;
 SQLiteDatabase database;
 int j=0;
 String songfileid="";

 private static com.google.api.services.drive.Drive service;

    private static  final  String LOGTAG="EXPLORECA";

    private static  final  String DATABASE_NAME="file.db";

    private static  final  int DATABASE_VERSION=1;
    private static  final  String TABLE="fileids";

    private static  final  String filename="fname";
    private static  final  String fileid="fid";

    String realid ="";


@Override
protected void onResume() {
    super.onResume();

    initDrive();

}

private void initDrive() {

    credential = GoogleAccountCredential.usingOAuth2(this,Arrays.asList(DriveScopes.DRIVE.split(",")));
    credential.setSelectedAccountName("shivrajp130@gmail.com");
    service = getDriveService(credential);

    if (mGoogleApiClient == null) {

        mGoogleApiClient = new GoogleApiClient.Builder(this).addApi(com.google.android.gms.drive.Drive.API)
                .addScope(com.google.android.gms.drive.Drive.SCOPE_FILE).setAccountName("shivrajp130@gmail.com")
                .addConnectionCallbacks(this).addOnConnectionFailedListener(this).build();
    }

    mGoogleApiClient.connect();

}


@Override
public void onConnectionFailed(ConnectionResult result) {
    // Called whenever the API client fails to connect.

    if (!result.hasResolution()) {
        // show the localized error dialog.
        showToast("Error in on connection failed");
        GooglePlayServicesUtil.getErrorDialog(result.getErrorCode(), this,
                0).show();
        return;
    }

    try {
        result.startResolutionForResult(this, REQUEST_CODE_RESOLUTION);
    } catch (SendIntentException e) {
        showToast("error" + e.toString());

    }
}

@Override
public void onConnected(Bundle connectionHint) {

    showToast("Inside Connected");
     sp = getSharedPreferences(Shared, Context.MODE_PRIVATE);
    showToast("Inside Connected");

     createSkyFolder();

}



private void createSkyFolder()
{
    // TODO Auto-generated method stub

    try
    {
      showToast("creating Folder");

     if(!sp.getString(isfolder, "false").contains("created"))
     {

        MetadataChangeSet changeSet = new MetadataChangeSet.Builder().
                                        setTitle("Sky folder").build();

        sky = Drive.DriveApi.getRootFolder(getGoogleApiClient())
            .createFolder(getGoogleApiClient(), changeSet).await();
        showToast("folder created");

        sp.edit().putString(isfolder, "created").commit();

    //  To store secret ID string of file or folder so that we can later get a DriveId object.

         realid = sky.getDriveFolder().getDriveId().encodeToString();

         sp.edit().putString(folderid, realid).commit();
         showToast("Real== "+realid);


     }

        DriveId retid = DriveId.decodeFromString(sp.getString(folderid, ""));

        DriveFolder folder = Drive.DriveApi.getFolder(getGoogleApiClient(), retid);

        MetadataChangeSet changeSet2 = new MetadataChangeSet.Builder()
        .setTitle("New folder")
        .build();
         MetadataResult res = folder.updateMetadata(getGoogleApiClient(), changeSet2).await();

        showToast("Folder== "+folder.getDriveId().encodeToString());

       showToast("folder created");

       upladfile();

    }
    catch(Exception e)
    {
        showToast(""+e);
    }

}

private void upladfile() {
    // TODO Auto-generated method stub

    String storedId=sp.getString(folderid, "");
    DriveId retid = DriveId.decodeFromString(storedId);

    DriveFolder skyfolder = Drive.DriveApi.getFolder(getGoogleApiClient(), retid);

    contentsresult = Drive.DriveApi.newContents(mGoogleApiClient).await();

    OutputStream outputStream = contentsresult.getContents().getOutputStream();
    String s = Environment.getExternalStoragePublicDirectory("Download")
            .getPath().toString();
    showToast(s);
    File file = new File(s + "/k.mp3");

    showToast("Path=" + Environment.DIRECTORY_DOWNLOADS + "/k"
            + file.length());
    buffer = new byte[(int) file.length()];

    try {
        showToast("started reading n writing");

        outputStream.write(buffer);
        showToast("Buffer is written");

    } catch (FileNotFoundException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
        showToast("" + e.toString());
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
        showToast("" + e.toString());
    }
    showToast("" + contentsresult.getContents().toString());


    //DriveFolder fldr = Drive.DriveApi.getFolder(getGoogleApiClient(),sky.getDriveFolder().getDriveId());

    MetadataChangeSet changeSet2 = new MetadataChangeSet.Builder()
            .setTitle("New file").setMimeType("audio/MP3").setStarred(true)
            .build();
    showToast("meta data created");

    DriveFileResult fileresult = skyfolder.createFile(getGoogleApiClient(),
            changeSet2, contentsresult.getContents()).await();

     songfileid = fileresult.getDriveFile().getDriveId().encodeToString();

    showToast("file has been created "+fileresult.toString());

//  Status stat = Drive.DriveApi.requestSync(mGoogleApiClient).await();

        showToast("await() complete");
    if (!contentsresult.getStatus().isSuccess()) {
        showToast("Error while trying to create the file");
        return;
    }

    add_to_db();
    getvalues();



    //String storedId=sp.getString(folderid, "");

    DriveId fffid = DriveId.decodeFromString(dbfileid.get(0));

    DriveFile fff = Drive.DriveApi.getFile(getGoogleApiClient(), fffid);


    MetadataChangeSet changeSet3 = new MetadataChangeSet.Builder()
    .setTitle("renamed")
    .build();
     MetadataResult res = fff.updateMetadata(getGoogleApiClient(), changeSet3).await();

    if(res!=null)
    {
        showToast("renamed"+res.getMetadata().getTitle());
    }
    try {

        //String iid=fffid.getResourceId();


        service.files().delete(fffid.getResourceId()).execute();

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

@Override
protected void onActivityResult(final int requestCode,
        final int resultCode, final Intent data) {
    if (requestCode == REQUEST_CODE_RESOLUTION && resultCode == RESULT_OK) {
        mGoogleApiClient.connect();
        showToast("Connected");
    }
}

@Override
protected void onPause() {
    if (mGoogleApiClient != null) {
        mGoogleApiClient.disconnect();
    }
    super.onPause();
}

public void showToast(final String toast) {
    runOnUiThread(new Runnable() {
        @Override
        public void run() {
            Toast.makeText(getApplicationContext(), toast,
                    Toast.LENGTH_SHORT).show();
        }
    });
}

public GoogleApiClient getGoogleApiClient() {
    return mGoogleApiClient;
}

public void add_to_db()
{

    dbhelper=new fileiddb(this);
    database=dbhelper.getWritableDatabase();
    ContentValues values = new ContentValues();


        String id =songfileid;
        String name="k";
        showToast("database id ="+id);

    values.put(fileid,id);
    values.put(filename,name);

    database.insert(TABLE, null, values);
    database.close();
    Toast.makeText(this,"Added Successfully" ,Toast.LENGTH_LONG).show();

}


 public void getvalues()
 {
     showToast("getting Values");

     // Select All Query
     String selectQuery = "SELECT  * FROM " + TABLE;
     dbhelper=new fileiddb(this);
        database=dbhelper.getWritableDatabase();
     Cursor cursor = database.rawQuery(selectQuery, null);

     // looping through all rows and adding to list
     if (cursor.moveToFirst()) {
         do {

             dbfileid.add(cursor.getString(0));
             dbfilename.add(cursor.getString(1));
             showToast("id=="+dbfileid.get(j).toString());
             j++;
         } while (cursor.moveToNext());
     }
 }

 private com.google.api.services.drive.Drive getDriveService(GoogleAccountCredential credential) {
        return new com.google.api.services.drive.Drive.Builder(AndroidHttp.newCompatibleTransport(), new GsonFactory(), credential)
            .build();
      }

@Override
public void onConnectionSuspended(int cause) {
    showToast("GoogleApiClient connection suspended");
}
}

delete外,一切正常。

service.files().delete(fffid.getResourceId()).execute();

1 个答案:

答案 0 :(得分:0)

任何REST Api的 .execute()(以及GDAA&#39; s .await()风格的调用)都必须在UI线程下运行。你应该把它包装成:

new AsyncTask<Void, Void, Void>() {
  @Override protected Integer doInBackground(String... params) { 
    //...
    return null;  
  }
}.execute();  // .cancel(true);

new Thread(new Runnable() { @Override public void run() {
  //....
}}).start();

祝你好运