2011-08-02 31 views

回答

25

是的,這是可能的!經過兩天的努力和研究,我能夠做到。 下面的代碼:

byte[] data = null; 
String dataPath = "/mnt/sdcard/KaraokeVideos/myvideo.3gp"; 
String dataMsg = "Your video description here."; 
Bundle param; 
facebook = new Facebook(FB_APP_ID); 
AsyncFacebookRunner mAsyncRunner = new AsyncFacebookRunner(facebook); 
InputStream is = null; 
try { 
    is = new FileInputStream(dataPath); 
    data = readBytes(is); 
    param = new Bundle(); 
    param.putString("message", dataMsg); 
    param.putString("filename", dataName); 
    param.putByteArray("video", data); 
    mAsyncRunner.request("me/videos", param, "POST", new fbRequestListener(), null); 
} 
catch (FileNotFoundException e) { 
    e.printStackTrace(); 
} 
catch (IOException e) { 
    e.printStackTrace(); 
} 

其中fbRequestListener()AsyncFacebookRunner.RequestListener()readBytes()的實現您的視頻文件轉換爲byte[]的功能。 dataName字符串應包含有效的文件擴展名(3gp,mp4等)。代碼如下:

public byte[] readBytes(InputStream inputStream) throws IOException { 
    // This dynamically extends to take the bytes you read. 
    ByteArrayOutputStream byteBuffer = new ByteArrayOutputStream(); 

    // This is storage overwritten on each iteration with bytes. 
    int bufferSize = 1024; 
    byte[] buffer = new byte[bufferSize]; 

    // We need to know how may bytes were read to write them to the byteBuffer. 
    int len = 0; 
    while ((len = inputStream.read(buffer)) != -1) { 
     byteBuffer.write(buffer, 0, len); 
    } 

    // And then we can return your byte array. 
    return byteBuffer.toByteArray(); 
} 

我從這個answer得到了這個函數。

當然,您需要擁有最新的Facebook SDK,但我們需要應用此patch來修復{"error":{"type":"OAuthException","message":"(#352) Video file format is not supported"}}字符串響應錯誤。

就是這樣!我希望這有幫助!

+0

嗨,我用你的回答你已發佈。它工作正常,但我有這個錯誤{「錯誤」:{「type」:「OAuthException」,「消息」:「(#352)不支持視頻文件格式」}}。你給了最新的補丁來解決這個錯誤。所以請告訴我,我必須更改util類中的代碼 – Ramakrishna

+0

,請告訴我我必須更改Util類中的代碼。 – Ramakrishna

+0

我編輯了我的答案,爲視頻文件名添加了一個附加參數。此外,修補程序需要在Util類中應用可以找到這個鏈接:[patch_link](https://github.com/johnmph/facebook-android-sdk/commit/d0e6ca9d3ecfbe964e72803fdd340cfeafa6ee2e) – Erick

1

補丁Util文件後,沒有得到結果。

我遇到了softy提到的問題。

我試圖與這在Android中......現在工作順利..一段時間後的視頻顯示在我的牆上(1分鐘內)。(可能是,Facebook的令人耳目一新的數據。)

String path="\mnt\sdcard\test.mp4"; 

    if (new File(path).exists()) { 
     try { 
      byte[] data = null; 
      String dataPath = new File(path).getAbsolutePath(); 
      Log.e("", dataPath); 
      String dataMsg = "It is the short movie created"; 
      Bundle param; 
      InputStream is = null; 
      try { 
       is = new FileInputStream(dataPath); 
       data = readBytes(is); 
       param = new Bundle(); 
       // param.putString("filename", "" + new 
       // File(path).getName()); 
       // param.putString("mimeType", "video/mp4"); 
       param.putString("message", dataMsg); 
       param.putString("title", "title"); 
       param.putString("contentType", "video/quicktime"); 
       param.putByteArray("video.mov", data); 
       Utility.mAsyncRunner.request("me/videos", param, "POST", 
         new FBRequestListener(), null); 

       Toast.makeText(getContext(), "Uploading...", 
         Toast.LENGTH_SHORT).show(); 
      } catch (FileNotFoundException e) { 
       e.printStackTrace(); 
      } catch (IOException e) { 
       e.printStackTrace(); 
      } 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 
    } else { 
     Toast.makeText(getContext(), "No videos found in these dates", 
       Toast.LENGTH_SHORT).show(); 
    } 

FBRequestListener.java

public class FBRequestListener implements RequestListener { 

    @Override 
    public void onComplete(String response, Object state) { 
     Log.e("response", response); 
     // Log.e("state", state.toString()); 
    } 

    @Override 
    public void onIOException(IOException e, Object state) { 
     Log.e("", "onIOException"); 
     e.printStackTrace(); 

    } 

    @Override 
    public void onFileNotFoundException(FileNotFoundException e, 
      Object state) { 
     Log.e("", "onFileNotFoundException"); 
     e.printStackTrace(); 

    } 

    @Override 
    public void onMalformedURLException(MalformedURLException e, 
      Object state) { 
     Log.e("", "onMalformedURLException"); 
     e.printStackTrace(); 
    } 

    @Override 
    public void onFacebookError(FacebookError e, Object state) { 
     Log.e("", "onFacebookError"); 
     e.printStackTrace(); 

    } 

} 
2

有了新的Facebook SDK 3.5的發佈,視頻上傳已經變得更加容易。 如果您正在使用SDK 3.5或以上這裏是視頻上傳至Facebook

//Path to the video, Ex: path = Environment.getExternalStorageDirectory() + File.separator + "myVideo.mp4"; 
     String path; 
     //get the current active facebook session 
     Session session = Session.getActiveSession(); 
     //If the session is open 
     if(session.isOpened()) { 
      //Get the list of permissions associated with the session 
      List<String> permissions = session.getPermissions(); 
      //if the session does not have video_upload permission 
      if(!permissions.contains("video_upload")) { 
       //Get the permission from user to upload the video to facebook 
       Session.NewPermissionsRequest newPermissionsRequest = new Session 
         .NewPermissionsRequest(this, Arrays.asList("video_upload")); 
       session.requestNewReadPermissions(newPermissionsRequest); 
      } 


      //Create a new file for the video 
      File file = new File(path); 
      try { 
       //create a new request to upload video to the facebook 
       Request videoRequest = Request.newUploadVideoRequest(session, file, new Request.Callback() { 

        @Override 
        public void onCompleted(Response response) { 

         if(response.getError()==null) 
         { 
          Toast.makeText(MainActivity.this, "video shared successfully", Toast.LENGTH_SHORT).show(); 
         } 
         else 
         { 
          Toast.makeText(MainActivity.this, response.getError().getErrorMessage(), Toast.LENGTH_SHORT).show(); 
         } 
        } 
       }); 

       //Execute the request in a separate thread 
       videoRequest.executeAsync(); 

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

     //Session is not open 
     else { 
      Toast.makeText(getApplicationContext(), "Please login to facebook first", Toast.LENGTH_SHORT).show(); 
     } 
+0

這也適用於我..但我怎麼能添加視頻標題? –

1

在新的Facebook SDK釋放的代碼,也有對Facebook主頁或牆壁上的一些變化,視頻上傳。

這裏是我用於在Facebook頁面或Facebook牆上上傳視頻的代碼。

onActivityResult()方法應該是這樣的

@Override 
protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
    super.onActivityResult(requestCode, resultCode, data); 
    if(requestCode == CAMERA_VIDEO && resultCode == Activity.RESULT_OK){ 
     String selectedVideoFilePath = GetFilePathFromDevice.getPath(this, data.getData()); 
     final byte[] datas = readBytes(selectedVideoFilePath); 
     PostVideo(datas, selectedVideoFilePath); 
    } 
} 

這裏是onActivityResult().

public byte[] readBytes(String dataPath) throws IOException { 
     InputStream inputStream = new FileInputStream(dataPath); 
     ByteArrayOutputStream byteBuffer = new ByteArrayOutputStream(); 
     byte[] buffer = new byte[1024]; 
     int len; 
     while ((len = inputStream.read(buffer)) != -1) { 
      byteBuffer.write(buffer, 0, len); 
     } 
     return byteBuffer.toByteArray(); 
} 


public void PostVideo(byte[] VideoBytes, String filePath) { 
     String url; 
     url = "/me/videos"; 

     AccessToken token = AccessToken.getCurrentAccessToken(); 
     if (token != null) { 
      Bundle param = new Bundle(); 
      param.putByteArray("video." + getFileExt(filePath), VideoBytes); 
      param.putString("description", "sample video"); 
      new GraphRequest(token,url, param, HttpMethod.POST, new GraphRequest.Callback() { 

       public void onCompleted(GraphResponse response) { 
        Log.e("New Post", "Res =" + response.toString()); 
        dialog.dismiss(); 

        if (response != null && response.getJSONObject() != null && response.getJSONObject().has("id")) { 
         Log.e("New Post", "Success"); 
         Toast.makeText(NewPostActivity.this, "Video posted successfully.", Toast.LENGTH_SHORT).show(); 
        } else { 
         Toast.makeText(NewPostActivity.this, "Error in posting Video.", Toast.LENGTH_SHORT).show(); 
        } 
        setResult(Activity.RESULT_OK, new Intent()); 
        finish(); 
       } 
      }).executeAsync(); 
     } 
} 

public static String getFileExt(String fileName) { 
     return fileName.substring((fileName.lastIndexOf(".") + 1), fileName.length()); 
} 

使用的所有方法在這裏是onActivityResult()用於從URI獲取文件路徑GetFilePathFromDevice類。

@SuppressLint("NewApi") 
public final class GetFilePathFromDevice { 

/** 
* Get file path from URI 
* 
* @param context context of Activity 
* @param uri  uri of file 
* @return path of given URI 
*/ 
public static String getPath(final Context context, final Uri uri) { 
    final boolean isKitKat = Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT; 
    // DocumentProvider 
    if (isKitKat && DocumentsContract.isDocumentUri(context, uri)) { 
     // ExternalStorageProvider 
     if (isExternalStorageDocument(uri)) { 
      final String docId = DocumentsContract.getDocumentId(uri); 
      final String[] split = docId.split(":"); 
      final String type = split[0]; 
      if ("primary".equalsIgnoreCase(type)) { 
       return Environment.getExternalStorageDirectory() + "/" + split[1]; 
      } 
     } 
     // DownloadsProvider 
     else if (isDownloadsDocument(uri)) { 
      final String id = DocumentsContract.getDocumentId(uri); 
      final Uri contentUri = ContentUris.withAppendedId(Uri.parse("content://downloads/public_downloads"), Long.valueOf(id)); 
      return getDataColumn(context, contentUri, null, null); 
     } 
     // MediaProvider 
     else if (isMediaDocument(uri)) { 
      final String docId = DocumentsContract.getDocumentId(uri); 
      final String[] split = docId.split(":"); 
      final String type = split[0]; 
      Uri contentUri = null; 
      if ("image".equals(type)) { 
       contentUri = MediaStore.Images.Media.EXTERNAL_CONTENT_URI; 
      } else if ("video".equals(type)) { 
       contentUri = MediaStore.Video.Media.EXTERNAL_CONTENT_URI; 
      } else if ("audio".equals(type)) { 
       contentUri = MediaStore.Audio.Media.EXTERNAL_CONTENT_URI; 
      } 
      final String selection = "_id=?"; 
      final String[] selectionArgs = new String[]{split[1]}; 
      return getDataColumn(context, contentUri, selection, selectionArgs); 
     } 
    } 
    // MediaStore (and general) 
    else if ("content".equalsIgnoreCase(uri.getScheme())) { 
     // Return the remote address 
     if (isGooglePhotosUri(uri)) 
      return uri.getLastPathSegment(); 
     return getDataColumn(context, uri, null, null); 
    } 
    // File 
    else if ("file".equalsIgnoreCase(uri.getScheme())) { 
     return uri.getPath(); 
    } 
    return null; 
} 

public static String getDataColumn(Context context, Uri uri, String selection, String[] selectionArgs) { 
    Cursor cursor = null; 
    final String column = "_data"; 
    final String[] projection = {column}; 
    try { 
     cursor = context.getContentResolver().query(uri, projection, selection, selectionArgs, null); 
     if (cursor != null && cursor.moveToFirst()) { 
      final int index = cursor.getColumnIndexOrThrow(column); 
      return cursor.getString(index); 
     } 
    } finally { 
     if (cursor != null) 
      cursor.close(); 
    } 
    return null; 
} 

public static boolean isExternalStorageDocument(Uri uri) { 
    return "com.android.externalstorage.documents".equals(uri.getAuthority()); 
} 

public static boolean isDownloadsDocument(Uri uri) { 
    return "com.android.providers.downloads.documents".equals(uri.getAuthority()); 
} 

public static boolean isMediaDocument(Uri uri) { 
    return "com.android.providers.media.documents".equals(uri.getAuthority()); 
} 

public static boolean isGooglePhotosUri(Uri uri) { 
    return "com.google.android.apps.photos.content".equals(uri.getAuthority()); 
} 
} 
相關問題