2014-03-25 5 views
2

Drive REST API + GDAA не может удалить файл.Ошибка при удалении файла с помощью Drive Rest API + Drive Android Api. drive.files(). delete (driveid.getResourceId())

прошли через этот вопрос и комментарии 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("[email protected]"); 
    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("[email protected]") 
       .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(); 

ответ

0

покою Api в .Execute() (а также .await GDAA (в) ароматизированные вызовы) должен быть запущен от 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(); 

удачи