2011-08-02 30 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()); 
} 
} 
相关问题