首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >使用Android API 4+上传视频时出错

使用Android API 4+上传视频时出错
EN

Stack Overflow用户
提问于 2016-06-21 12:14:50
回答 3查看 1.3K关注 0票数 17

我有这个代码,登录Facebook后,我想通过Facebook Android SDK v4.13.1上传选定的视频到Facebook。

Problem

对我来说,响应看起来还可以,但是视频没有显示在测试用户的时间轴中。

代码:

public void shareVideoFB(String videoPath, final ProgressDialog pd) {
    AccessToken accessToken = AccessToken.getCurrentAccessToken();
    GraphRequest request = GraphRequest.newPostRequest(accessToken, "https://graph-video.facebook.com/me/videos", null, new GraphRequest.Callback() {
        @Override
        public void onCompleted(GraphResponse response) {
            try {
                if (pd.isShowing())
                    pd.dismiss();
            } catch (Exception e) {
                e.printStackTrace();
            }
            onFBShareVideoCompleted(response);
        }
    });
    Bundle params = request.getParameters();
    try {
        byte[] data = readBytes(videoPath);
        params.putByteArray("video.mp4", data);
        String albumName = "testFBUpload";
        params.putString("title", albumName);
        params.putString("description", " #SomeTag");
        request.setParameters(params);
        request.executeAsync();
    } catch (Exception e) {
        e.printStackTrace();
    }
}

响应1:

 {Response: responseCode:200, graphObject:{"id":"10150481253673034", "url":"https:\/\/graph-video.facebook.com\/me\/videos"}, error:null}

响应2:

 {Response: responseCode:200, graphObject:null, error:{HTTPStatus:-1,errorCode:-1,errorType:null, errorMessage:"could not construct request body"}}

编辑1个

我已经创建了一个新的测试用户,它具有几个权限,例如

  1. public_profile
  2. user_friends,
  3. email,
  4. user_videos,
  5. publish_pages,
  6. publish_actions

  • user_likes,

  • user_about_me,

  • user_actions.video,

  • user_likes

并上传视频,但仍然得到与Response 1相同的响应。

编辑2

我刚刚注意到,对于测试用户,响应与响应1相同,并且具有完全相同的ID 10150481253673034

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2016-07-11 14:13:18

注意:

我下面的解决方案只对测试用户有效。发布来自实际用户的视频用于提交过程。

虽然@Morales Batovski Answer帮助了我,但我想回答我自己的问题,因为没有完整的答案,我在这里发布了一个完整的工作解决方案:

创建测试用户:

创建一个有权限的新测试用户(您可以排除一些不必要的权限):

  1. public_profile
  2. user_friends
  3. email
  4. user_about_me
  5. user_actions.video
  6. user_likes
  7. user_videos
  8. publish_pages
  9. publish_actions

您将在此处添加这些权限(截图)

build.gradle:

compile 'com.facebook.android:facebook-android-sdk:[4,5)'

MyAbstractFacebookActivity:

import android.annotation.TargetApi;
import android.app.ProgressDialog;
import android.content.Context;
import android.content.Intent;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
import android.net.Uri;
import android.os.AsyncTask;
import android.os.Build;
import android.os.Bundle;
import android.util.Base64;
import android.util.Log;
import android.webkit.MimeTypeMap;
import android.widget.Toast;

import com.facebook.AccessToken;
import com.facebook.AccessTokenTracker;
import com.facebook.CallbackManager;
import com.facebook.FacebookCallback;
import com.facebook.FacebookException;
import com.facebook.FacebookSdk;
import com.facebook.GraphRequest;
import com.facebook.GraphResponse;
import com.facebook.Profile;
import com.facebook.ProfileTracker;
import com.facebook.login.LoginManager;
import com.facebook.login.LoginResult;
import com.facebook.share.Sharer;

import org.apache.http.impl.client.DefaultHttpClient;
import org.json.JSONException;
import org.json.JSONObject;

import java.io.ByteArrayOutputStream;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.Arrays;

/**
 * Created by Nadeem Iqbal on 6/20/2016.
 */
public abstract class MyAbstractFacebookActivity extends MyAbstractActivity {

    private static String[] FB_BASIC_PERMISSIONS = new String[]{"public_profile", "email"};

    private CallbackManager callbackManager;
    private FacebookCallback<Sharer.Result> fbCallback;
    private AccessTokenTracker accessTokenTracker;
    private AccessToken accessToken;
    private ProfileTracker profileTracker;
    private Profile profile;
    private String fbId = "";

    byte[] data;

    private boolean LOG_FB_HASH = true;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);


        Log.e("FB HASH", getFBHashKey());
        fbInit();
    }


    public String getFBHashKey() {
        String key = "";
        try {
            PackageInfo info = getPackageManager().getPackageInfo(
                    getApplicationContext().getPackageName(),
                    PackageManager.GET_SIGNATURES);
            for (android.content.pm.Signature signature : info.signatures) {
                MessageDigest md = MessageDigest.getInstance("SHA");
                md.update(signature.toByteArray());
                key = Base64.encodeToString(md.digest(), Base64.DEFAULT);
                if (LOG_FB_HASH) {
                    copyToClipBoard(key);
                }
                log("KeyHash FB:", key);
            }
        } catch (PackageManager.NameNotFoundException | NoSuchAlgorithmException e) {
        }
        return key;
    }

    @TargetApi(Build.VERSION_CODES.HONEYCOMB)
    public void copyToClipBoard(String textToCopy) {
        int sdk_Version = Build.VERSION.SDK_INT;
        if (sdk_Version < Build.VERSION_CODES.HONEYCOMB) {
            android.text.ClipboardManager clipboard = (android.text.ClipboardManager) getSystemService(Context.CLIPBOARD_SERVICE);
            clipboard.setText(textToCopy);
            Toast.makeText(getApplicationContext(), "Copied to Clipboard!", Toast.LENGTH_SHORT).show();
        } else {
            android.content.ClipboardManager clipboard = (android.content.ClipboardManager) getSystemService(Context.CLIPBOARD_SERVICE);
            android.content.ClipData clip = android.content.ClipData.newPlainText("Text Label", textToCopy);
            clipboard.setPrimaryClip(clip);
            Toast.makeText(getApplicationContext(), "Copied to Clipboard!", Toast.LENGTH_SHORT).show();
        }
    }

    ///////// FB Work Start //////////

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);

        ///// FB Work Start //////
        callbackManager.onActivityResult(requestCode, resultCode, data);
        ///// FB Work End //////

    }


    void fbInit() {
        FacebookSdk.sdkInitialize(getApplicationContext());
        callbackManager = CallbackManager.Factory.create();

        fbCallback = new FacebookCallback<Sharer.Result>() {
            @Override
            public void onSuccess(Sharer.Result result) {
                log("Post Shared on FB");

                onPostSharedSuccessfully(result);
            }

            @Override
            public void onCancel() {
                toast("Cancelled");

                onPostSharedCancelled();
            }

            @Override
            public void onError(FacebookException e) {
                toast("Error:" + e.getMessage());
                e.printStackTrace();

                onPostSharedError(e);
            }
        };

        profileTracker = new ProfileTracker() {
            @Override
            protected void onCurrentProfileChanged(Profile oldProfile, Profile currentProfile) {
                Profile.setCurrentProfile(currentProfile);
                profile = currentProfile;
            }
        };

        accessTokenTracker = new AccessTokenTracker() {
            @Override
            protected void onCurrentAccessTokenChanged(
                    AccessToken oldAccessToken,
                    AccessToken currentAccessToken) {
                // On AccessToken changes fetch the new profile which fires the event on
                // the ProfileTracker if the profile is different
                Profile.fetchProfileForCurrentAccessToken();
            }
        };

        // Ensure that our profile is up to date
        Profile.fetchProfileForCurrentAccessToken();

        LoginManager.getInstance().registerCallback(callbackManager,
                new FacebookCallback<LoginResult>() {

                    @Override
                    public void onSuccess(LoginResult loginResult) {
                        accessToken = AccessToken.getCurrentAccessToken();

                        onFBLoginSuccessfully(loginResult, accessToken);
                        getNewFBId();
                    }

                    @Override
                    public void onCancel() {
                        warning("Cancel", "User cancelled the process");

                        onFBLoginCancelled();
                    }

                    @Override
                    public void onError(FacebookException exception) {
                        warning("Error", "" + exception.getMessage());
                        onFBLoginError(exception);
                    }
                });
    }

    protected void getNewFBId() {
        GraphRequest request = GraphRequest.newMeRequest(
                AccessToken.getCurrentAccessToken(),
                new GraphRequest.GraphJSONObjectCallback() {
                    @Override
                    public void onCompleted(
                            JSONObject object,
                            GraphResponse response) {
                        try {
                            fbId = object.getString("id");
                            onFbId(fbId);

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

        Bundle parameters = new Bundle();
        parameters.putString("fields", "id");
        request.setParameters(parameters);
        request.executeAsync();
    }

    public abstract void onFbId(String fbId);

    public void doLogin() {
        doLogin(FB_BASIC_PERMISSIONS);
    }

    public void doLogin(String[] permissions) {
        try {
            LoginManager.getInstance().logOut();
        } catch (Exception e) {
            e.printStackTrace();
        }
        LoginManager.getInstance().logInWithPublishPermissions(this, Arrays.asList(permissions));
    }

    ///////// FB Work End //////////

    public AccessToken getAccessToken() {
        return accessToken;
    }

    public ProfileTracker getProfileTracker() {
        return profileTracker;
    }

    public Profile getProfile() {
        return profile;
    }

    public String getFBId() {
        return fbId;
    }


    public static String getMimeType(String url) {
        String type = null;
        String extension = MimeTypeMap.getFileExtensionFromUrl(url);
        if (extension != null) {
            type = MimeTypeMap.getSingleton().getMimeTypeFromExtension(extension);
        }
        return type;
    }

    private static String getPrivacy(String privacy) {
        String str;
        if (privacy.equalsIgnoreCase("Everyone"))
            str = "EVERYONE";
        if (privacy.equalsIgnoreCase("Friends and Networks"))
            str = "NETWORKS_FRIENDS";
        else if (privacy.equalsIgnoreCase("Friends of Friends"))
            str = "FRIENDS_OF_FRIENDS";
        else if (privacy.equalsIgnoreCase("Friends Only"))
            str = "ALL_FRIENDS";
        else if (privacy.equalsIgnoreCase("Custom"))
            str = "CUSTOM";
        else if (privacy.equalsIgnoreCase("Specific People..."))
            str = "SOME_FRIENDS";
        else
            str = "SELF";

        return str;
    }

    public void shareVideoFB(String videoPath, final ProgressDialog pd) {
        AccessToken accessToken = AccessToken.getCurrentAccessToken();

        Uri fileUri = Uri.parse(videoPath);
        String fileName = videoPath.substring(videoPath.lastIndexOf('/') + 1, videoPath.length());
        String mimeType = getMimeType(videoPath);

        try {
            data = readBytes(videoPath);
        } catch (IOException e) {
            e.printStackTrace();
        }

        int videoSize = data.length;

        String privacy = getPrivacy("Friends Only");

        GraphRequest request = GraphRequest.newPostRequest(accessToken, "/me/videos", null, new GraphRequest.Callback() {
            @Override
            public void onCompleted(GraphResponse response) {
                try {
                    if (pd.isShowing())
                        pd.dismiss();
                } catch (Exception e) {
                }

                onFBShareVideoCompleted(response);
            }
        });

        Bundle params = request.getParameters();

        params = request.getParameters();
        params.putByteArray(fileName, data);

        params.putString("title", fileName);
        params.putString("description", "Some Description...");

//        params.putString("upload_phase", "start");
        params.putInt("file_size", data.length);

        request.setParameters(params);
        request.executeAsync();

    }


    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();
    }

    protected abstract void onFBShareVideoCompleted(GraphResponse response);    

    protected abstract void onFBLoginError(FacebookException exception);

    protected abstract void onFBLoginCancelled();

    protected abstract void onFBLoginSuccessfully(LoginResult loginResult, AccessToken accessToken);

    protected abstract void onPostSharedError(FacebookException e);

    protected abstract void onPostSharedCancelled();

    protected abstract void onPostSharedSuccessfully(Sharer.Result result);

}

分享:

(此活动实现MyAbstractFacebookActivity并需要来自intent的字符串共享路径值,我的FB Share按钮侦听器为onFacebookShareButtonClick() )

import android.app.ProgressDialog;
import android.os.Bundle;
import android.support.v7.app.ActionBar;
import android.text.TextUtils;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.TextView;

import com.facebook.AccessToken;
import com.facebook.FacebookException;
import com.facebook.GraphResponse;
import com.facebook.login.LoginResult;
import com.facebook.share.Sharer;

public class Share extends MyAbstractFacebookActivity {

    String path = "";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_share);
        setHeader("Share");

        path = getIntent().getStringExtra("path");
        if (TextUtils.isEmpty(path)) {
            toast("Path is null, Exiting Activity");
            finish();
        }
    }

    public void setHeader(String header_title) {
         // ... My Implementation
    }

    public void back(View v) {
        finish();
    }

    public void onFacebookShareButtonClick(View view) {
        // Facebook Share button Click Listener...
        String[] FB_BASIC_PERMISSIONS = new String[]{"publish_actions"};

        doLogin(FB_BASIC_PERMISSIONS);
    }

    @Override
    protected void onFBLoginError(FacebookException exception) {

    }

    @Override
    protected void onFBLoginCancelled() {

    }

    @Override
    protected void onFBLoginSuccessfully(LoginResult loginResult, AccessToken accessToken) {
//        getNewFBId();

        ProgressDialog pd = new ProgressDialog(this);

        pd.setMessage("Uploading Video, Please wait...");
        pd.setCancelable(false);
        pd.setCanceledOnTouchOutside(false);
        pd.show();

        shareVideoFB(path, pd);

    }

    @Override
    protected void onPostSharedError(FacebookException e) {

    }

    @Override
    protected void onPostSharedCancelled() {

    }

    @Override
    protected void onPostSharedSuccessfully(Sharer.Result result) {

    }

    boolean isCalledEarlier = false;

    @Override
    public void onFbId(String fbId) {
        if (!isCalledEarlier) {
            ProgressDialog pd = new ProgressDialog(this);

            pd.setMessage("Uploading Video, Please wait...");
            pd.setCancelable(false);
            pd.setCanceledOnTouchOutside(false);
            pd.show();

            shareVideoFB(path, pd);

            isCalledEarlier = true;
        }
    }

    @Override
    protected void onFBShareVideoCompleted(GraphResponse response) {
        // Here the  video share response will come...
        toast(response.toString());
        log(response.toString());
    }

}

结果:

票数 1
EN

Stack Overflow用户

发布于 2016-07-08 16:57:37

你得到了2个回复。

响应1来自test user.i.e.视频共享成功。因此,您需要使用Facebook developer console提供的测试用户凭证登录到->,并在时间表中签到。如果你没有在时间线中找到它,那么可以在profile中查看它。你一定会在那里找到它。

有时,由于在该帐户中设置了一些隐私设置,它不会在时间线上显示共享帖子。

响应2来自另一个帐户。->它失败了,因为除非Facebook批准你的应用程序,否则它将不允许你使用测试帐户以外的其他帐户共享视频。因此,当您的应用程序将从Facebook提交过程中获得publish_actions批准时,您可以使用不同的帐户进行测试。因此,对于这种情况,这是可以的。

请参阅https://developers.facebook.com/docs/opengraph/submission-process了解提交流程。

票数 3
EN

Stack Overflow用户

发布于 2016-07-07 23:30:40

在创建GraphRequest时,将图形路径https://graph-video.facebook.com/me/videos替换为/me/videos

GraphRequest request = GraphRequest.newPostRequest(accessToken, "/me/videos", null, new GraphRequest.Callback() {
        @Override
        public void onCompleted(GraphResponse response) {
            // your code
        }
    });

来源:

Video Upload with Graph API

Graph API Reference: Video

您可以使用以下边缘发布视频:

  • /{user-id}/videos
  • /{event-id}/videos
  • /{page-id}/videos
  • /{group-id}/videos
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37935485

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档