2014-12-09 9 views
6

मैंने ड्राइव एपीआई गाइड (https://developer.android.com/google/play-services/drive.html) का पालन किया है और मेरा ऐप अब फोटो को आसानी से अपलोड करता है, लेकिन अब मैं बिना सफलता के वीडियो (एमपी 4) अपलोड करने की कोशिश कर रहा हूं।Google ड्राइव प्रोग्रामेटिक रूप से वीडियो अपलोड करना (एंड्रॉइड एपीआई)

क्या कोई यह जानता है कि इसे कैसे प्राप्त किया जाए? यह वीडियो एक नई जेनरेट की गई एमपी 4 फ़ाइल है और मेरे पास डिवाइस पर संग्रहीत करने का मार्ग है।

इस तरह किया चित्रों इसके लिए:

Drive.DriveApi.newDriveContents(mDriveClient).setResultCallback(
    new ResultCallback<DriveContentsResult>() { 

@Override 
public void onResult(DriveContentsResult result) { 
    if (!result.getStatus().isSuccess()) { 
     Log.i(TAG, "Failed to create new contents."); 
     return; 
    } 
    OutputStream outputStream = result.getDriveContents().getOutputStream(); 
    // Write the bitmap data from it. 
    ByteArrayOutputStream bitmapStream = new ByteArrayOutputStream(); 
    image.compress(Bitmap.CompressFormat.JPEG, 80, bitmapStream); 
    try { 
     outputStream.write(bitmapStream.toByteArray()); 
    } catch (IOException e1) { 
     Log.i(TAG, "Unable to write file contents."); 
    } 
    image.recycle(); 
    outputStream = null; 
    String title = Shared.getOutputMediaFile(Shared.MEDIA_TYPE_IMAGE).getName(); 
    MetadataChangeSet metadataChangeSet = new MetadataChangeSet.Builder() 
     .setMimeType("image/jpeg").setTitle(title) 
     .build(); 
    Log.i(TAG, "Creating new pic on Drive (" + title + ")"); 

    Drive.DriveApi.getFolder(mDriveClient, 
     mPicFolderDriveId).createFile(mDriveClient, 
     metadataChangeSet, result.getDriveContents()); 
     } 
    }); 
} 

क्या मैं में दिलचस्पी है इस मामले में एक "वीडियो/mp4" की ओर इशारा करते में एक फ़ाइल के लिए एक वैकल्पिक, है।

+0

आप के लिए क्या किया तरह GDrive को csv फ़ाइल अपलोड करने के लिए कैसे छवि/वीडियो –

+1

यदि आप 2 जीबी जैसे बड़े वीडियो अपलोड कर रहे हैं तो यह कोड क्रैश हो जाएगा ... आप बाइटएरे ऑटपुट में पूरी फाइल को लिखते हैं ... अच्छा नहीं –

उत्तर

3

ज्यादा विस्तार, बस कुछ संकेत में हो रही बिना:

कुछ भी आप अपलोड करना चाहते हैं (छवि, पाठ, वीडियो, ...) से

  1. एक फ़ाइल
  2. सेटिंग बनाने होते हैं मेटाडेटा (शीर्षक, MIME प्रकार, विवरण, ...)
  3. सेटिंग सामग्री (बाइट धारा)

डेमो आप इसका उल्लेख एक छवि (जेपीईजी बाइटस्ट्रीम) के साथ करता है और आपको इसे वीडियो के साथ करने की ज़रूरत है। तो, आप जो परिवर्तन को लागू करने की जरूरत है:

  • आप अपने वीडियो के लिए की जरूरत के साथ "image/jpeg" MIME प्रकार की जगह
  • अपने वीडियो स्ट्रीम (outputStream.write (bitmapStream.toByteArray कॉपी()) ...)

सामग्री पर।

ये केवल एक ही बदलाव हैं जिन्हें आपको बनाने की आवश्यकता है। Google ड्राइव एंड्रॉइड एपीआई परवाह नहीं है कि आपकी सामग्री और मेटाडाटा क्या है, यह सिर्फ Google ड्राइव पर इसे धक्का देता है।

Google ड्राइव में, ऐप्स (वेब, एंड्रॉइड, ...) मेटाडेटा और सामग्री पढ़ते हैं, और इसके अनुसार इसका इलाज करते हैं।

+0

मैं उपयोगकर्ता को अपने खाते से लॉगिन करने के बाद सीएसवी फ़ाइल अपलोड करने की कोशिश कर रहा हूं, लेकिन मैं अपलोड करने के लिए सेवाओं का उपयोग करने में असमर्थ हूं, यह मेरा प्रश्न यहां अपलोड करने के लिए कोई तरीका है http://stackoverflow.com/questions/27738070/upload-csv-file-to-gdrive-progrmmatically-shows-issue-in- सेवा –

+0

मैंने वास्तव में SO पर आपका प्रश्न पढ़ा है, लेकिन दुर्भाग्य से मैं इस समय बहुत व्यस्त हूं। आप इस परीक्षण को डाउनलोड करने का प्रयास कर सकते हैं, मैंने बहुत समय पहले एक साथ smacked - तो यह पुराना हो सकता है। https://github.com/seanpjanson/140201-GDAA। यह डमी टेक्स्ट लिखता है और ड्राइव पर फाइल बनाता है। चूंकि सीएसवी फाइलें टेक्स्ट फाइलें हैं, इसलिए आप इसका उपयोग कर सफल हो सकते हैं (लेकिन एमआईएमई प्रकार को संशोधित करें)। मैं आशा करता हूं कि मैं 2 हफ्तों के भीतर इसका एक नया संस्करण पोस्ट करूंगा। – seanpj

0

यदि आप Google ड्राइव पर कोई भी फ़ाइल अपलोड करना चाहते हैं, तो सिंक्रनाइज़ेशन कार्य के साथ नीचे दिए गए कोड का उपयोग करें, यह आपकी फ़ाइल को ड्राइव पर अपलोड करेगा।

AsyncTask<Void, Void, String> task = new AsyncTask<Void, Void, String>() 
       { 
      @Override 
      protected String doInBackground(Void... params) 
      { 
       String file_type="video/mp4"; //write your file type 
       File body = new File();     
       File FileRtr = null; 
       body.setTitle(myfile.getName()); 
       body.setMimeType(file_type); 
       body.setParents(Arrays.asList(new ParentReference().setId(LocationID))); //LocationID means the path in the drive e where you want to upload it 
      try 
      { 
       FileContent mediaContent = new FileContent(file_type, myfile); 
       FileRtr = mService.files().insert(body, mediaContent).execute(); 

       if (FileRtr != null) 
       { 
       System.out.println("File uploaded: " + FileRtr.getTitle()); 

       } 
       } 
       catch (IOException e) 
       { 
       System.out.println("An error occurred: " + e.getMessage()); 
       } 
       return null; 

      } 
      protected void onPostExecute(String token) 
      { 
      Toast.makeText(mContext, "Uploaded Successfuly",Toast.LENGTH_LONG).show(); 
      } 
      }; 
     task.execute();  
+1

पीर, आप रीस्टफुल एपीआई (https://developers.google.com/drive/v2/reference/) का सुझाव दे रहे हैं, जबकि सवाल जीडीएए के डोमेन में है (https://developers.google.com/drive/android /)। जीडीएए में समय/विलंबता के मुद्दों के कारण इन 2 को मिश्रण करना अच्छा नहीं है। जैसा कि मैंने पहले से ही कुछ बार उल्लेख किया है, मैंने 'GDAA' को हटाने के बाद RESTful घंटों द्वारा हटाई गई फ़ाइल में लिखा है। या लंबे समय तक एक फ़ोल्डर में एक फाइल बनाएँ। – seanpj

0

ओपी द्वारा समाधान।

धन्यवाद seanpj करने के लिए, पता चला है कि मैं इस की कठिनाई overestimating था, मैं अब दोनों चित्र और वीडियो अपलोड करने के लिए इस विधि का उपयोग:

/** 
* Create a new file and save it to Drive. 
*/ 
private void saveFiletoDrive(final File file, final String mime) { 
    // Start by creating a new contents, and setting a callback. 
    Drive.DriveApi.newDriveContents(mDriveClient).setResultCallback(
      new ResultCallback<DriveContentsResult>() { 
       @Override 
       public void onResult(DriveContentsResult result) { 
        // If the operation was not successful, we cannot do 
        // anything 
        // and must 
        // fail. 
        if (!result.getStatus().isSuccess()) { 
         Log.i(TAG, "Failed to create new contents."); 
         return; 
        } 
        Log.i(TAG, "Connection successful, creating new contents..."); 
        // Otherwise, we can write our data to the new contents. 
        // Get an output stream for the contents. 
        OutputStream outputStream = result.getDriveContents() 
          .getOutputStream(); 
        FileInputStream fis; 
        try { 
         fis = new FileInputStream(file.getPath()); 
         ByteArrayOutputStream baos = new ByteArrayOutputStream(); 
         byte[] buf = new byte[1024]; 
         int n; 
         while (-1 != (n = fis.read(buf))) 
          baos.write(buf, 0, n); 
         byte[] photoBytes = baos.toByteArray(); 
         outputStream.write(photoBytes); 

         outputStream.close(); 
         outputStream = null; 
         fis.close(); 
         fis = null; 

        } catch (FileNotFoundException e) { 
         Log.w(TAG, "FileNotFoundException: " + e.getMessage()); 
        } catch (IOException e1) { 
         Log.w(TAG, "Unable to write file contents." + e1.getMessage()); 
        } 

        String title = file.getName(); 
        MetadataChangeSet metadataChangeSet = new MetadataChangeSet.Builder() 
          .setMimeType(mime).setTitle(title).build(); 

        if (mime.equals(MIME_PHOTO)) { 
         if (VERBOSE) 
          Log.i(TAG, "Creating new photo on Drive (" + title 
            + ")"); 
         Drive.DriveApi.getFolder(mDriveClient, 
           mPicFolderDriveId).createFile(mDriveClient, 
           metadataChangeSet, 
           result.getDriveContents()); 
        } else if (mime.equals(MIME_VIDEO)) { 
         Log.i(TAG, "Creating new video on Drive (" + title 
           + ")"); 
         Drive.DriveApi.getFolder(mDriveClient, 
           mVidFolderDriveId).createFile(mDriveClient, 
           metadataChangeSet, 
           result.getDriveContents()); 
        } 

        if (file.delete()) { 
         if (VERBOSE) 
          Log.d(TAG, "Deleted " + file.getName() + " from sdcard"); 
        } else { 
         Log.w(TAG, "Failed to delete " + file.getName() + " from sdcard"); 
        } 
       } 
      }); 
} 
0
private void saveFiletoDrive(final File file, final String mime) { 
     Drive.DriveApi.newDriveContents(mGoogleApiClient).setResultCallback(
       new ResultCallback<DriveContentsResult>() { 

        @Override 
        public void onResult(DriveContentsResult result) { 

         if (!result.getStatus().isSuccess()) { 
          Log.i(TAG, "Failed to create new contents."); 
          return; 
         } 
         Log.i(TAG, "Connection successful, creating new contents..."); 
         OutputStream outputStream = result.getDriveContents() 
           .getOutputStream(); 
         FileInputStream fis; 
         try { 
          fis = new FileInputStream(file.getPath()); 
          ByteArrayOutputStream baos = new ByteArrayOutputStream(); 
          byte[] buf = new byte[1024]; 
          int n; 
          while (-1 != (n = fis.read(buf))) 
           baos.write(buf, 0, n); 
          byte[] photoBytes = baos.toByteArray(); 
          outputStream.write(photoBytes); 

          outputStream.close(); 
          outputStream = null; 
          fis.close(); 
          fis = null; 

         } catch (FileNotFoundException e) { 
          Log.w(TAG, "FileNotFoundException: " + e.getMessage()); 
         } catch (IOException e1) { 
          Log.w(TAG, "Unable to write file contents." + e1.getMessage()); 
         } 

         String title = file.getName(); 
         MetadataChangeSet metadataChangeSet = new MetadataChangeSet.Builder() 
           .setMimeType(mime).setTitle(title).build(); 

         if (mime.equals(MIME_PHOTO)) { 
          if (VERBOSE) 
           Log.i(TAG, "Creating new photo on Drive (" + title 
             + ")"); 
          Drive.DriveApi.getFolder(mGoogleApiClient, 
            mPicFolderDriveId).createFile(mGoogleApiClient, 
            metadataChangeSet, 
            result.getDriveContents()); 
         } else if (mime.equals(MIME_VIDEO)) { 
          Log.i(TAG, "Creating new video on Drive (" + title 
            + ")"); 
          Drive.DriveApi.getFolder(mGoogleApiClient, 
            mVidFolderDriveId).createFile(mGoogleApiClient, 
            metadataChangeSet, 
            result.getDriveContents()); 
         } 

         if (file.delete()) { 
          if (VERBOSE) 
           Log.d(TAG, "Deleted " + file.getName() + " from sdcard"); 
         } else { 
          Log.w(TAG, "Failed to `enter code here`delete " + file.getName() + " from sdcard"); 
         } 
        } 
       }); 
    } 
+0

यह जोड़ना अच्छा है कि आपने क्या संशोधित किया और आपके उत्तरों का क्यों। – user5014677

-1

तो यह मेरा पूरा कोड मेरे द्वारा अपलोड की कैसे हासिल की एक वीडियो। चरण:

  • यूरी (मेरे मामले में) से वीडियो फ़ाइल प्राप्त करें।
  • के रूप में कोड
  • एपीआई पृष्ठभूमि

सार्वजनिक वर्ग UploadVideo फैली AppCompatActivity {

में फ़ाइल अपलोड करेंगे ouputStream को बाइट सरणी बारे में उल्लेख किया bytearray outputstream से बाइट सरणी जाओ
DriveClient mDriveClient; 
DriveResourceClient mDriveResourceClient; 
GoogleSignInAccount googleSignInAccount; 
String TAG = "Drive"; 
private final int REQUEST_CODE_CREATOR = 2013; 
Task<DriveContents> createContentsTask; 
String uri; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_upload_video); 
    //Fetching uri or path from previous activity. 
    uri = getIntent().getStringExtra("uriVideo"); 
    //Get previously signed in account. 
    googleSignInAccount = GoogleSignIn.getLastSignedInAccount(this); 
    if (googleSignInAccount != null) { 
     mDriveClient = Drive.getDriveClient(getApplicationContext(), googleSignInAccount); 
     mDriveResourceClient = 
       Drive.getDriveResourceClient(getApplicationContext(), googleSignInAccount); 
    } 
    else Toast.makeText(this, "Login again and retry", Toast.LENGTH_SHORT).show(); 
    createContentsTask = mDriveResourceClient.createContents(); 
    findViewById(R.id.uploadVideo).setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View view) { 
       createFile(); 
     } 
    }); 
} 

private void createFile() { 
    // [START create_file] 
    final Task<DriveFolder> rootFolderTask = mDriveResourceClient.getRootFolder(); 
    final Task<DriveContents> createContentsTask = mDriveResourceClient.createContents(); 
    Tasks.whenAll(rootFolderTask, createContentsTask) 
      .continueWithTask(new Continuation<Void, Task<DriveFile>>() { 
       @Override 
       public Task<DriveFile> then(@NonNull Task<Void> task) throws Exception { 
        DriveFolder parent = rootFolderTask.getResult(); 
        DriveContents contents = createContentsTask.getResult(); 
        File file = new File(uri); 
        ByteArrayOutputStream baos = new ByteArrayOutputStream(); 
        byte[] buf = new byte[1024]; 
        FileInputStream fis = new FileInputStream(file); 
        for (int readNum; (readNum = fis.read(buf)) != -1;) { 
         baos.write(buf, 0, readNum); 
        } 
        OutputStream outputStream = contents.getOutputStream(); 
        outputStream.write(baos.toByteArray()); 

        MetadataChangeSet changeSet = new MetadataChangeSet.Builder() 
          .setTitle("MyVideo.mp4") // Provide you video name here 
          .setMimeType("video/mp4") // Provide you video type here 
          .build(); 

        return mDriveResourceClient.createFile(parent, changeSet, contents); 
       } 
      }) 
      .addOnSuccessListener(this, 
        new OnSuccessListener<DriveFile>() { 
         @Override 
         public void onSuccess(DriveFile driveFile) { 
          Toast.makeText(Upload.this, "Upload Started", Toast.LENGTH_SHORT).show(); 
          finish(); 
         } 
        }) 
      .addOnFailureListener(this, new OnFailureListener() { 
       @Override 
       public void onFailure(@NonNull Exception e) { 
        Log.e(TAG, "Unable to create file", e); 
        finish(); 
       } 
      }); 
    // [END create_file] 
} 

}

+0

कृपया केवल लिंक प्रदान करने के बजाय अपने उत्तर की व्याख्या करें। समय के साथ लिंक बदल सकते हैं। –

+0

हालांकि यह लिंक प्रश्न का उत्तर दे सकता है, लेकिन यहां उत्तर के आवश्यक हिस्सों को शामिल करना बेहतर है और संदर्भ के लिए लिंक प्रदान करना बेहतर है। लिंक किए गए पृष्ठ में परिवर्तन होने पर लिंक-केवल उत्तर अमान्य हो सकते हैं। - [समीक्षा से] (/ समीक्षा/कम गुणवत्ता वाली पोस्ट/18655942) –

+0

यह प्रश्न का उत्तर नहीं प्रदान करता है। एक बार आपके पास पर्याप्त [प्रतिष्ठा] (https://stackoverflow.com/help/whats-reputation) हो जाने पर आप [किसी भी पोस्ट पर टिप्पणी कर सकेंगे] (https://stackoverflow.com/help/privileges/comment); इसके बजाय, [उन उत्तरों को प्रदान करें जिन्हें पूछताछ से स्पष्टीकरण की आवश्यकता नहीं है] (https://meta.stackexchange.com/questions/214173/why-do-i-need-50-reputation-to-comment-what-can- i-कर-बजाय)। - [समीक्षा से] (/ समीक्षा/कम गुणवत्ता वाली पोस्ट/18655942) – AsifAli72090

संबंधित मुद्दे