【问题标题】:Android Sharing on Facebook (SDK 4)Facebook 上的 Android 共享 (SDK 4)
【发布时间】:2015-07-10 11:55:19
【问题描述】:

尝试使用 Facebook SDK 4.0 for android 共享图像。

app.gradle

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    compile 'com.android.support:appcompat-v7:22.1.1'
    // Facebook's library to implement Login with Facebook
    compile 'com.facebook.android:facebook-android-sdk:4.0.1'
}

AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.facebookshare" >
    <uses-permission android:name="android.permission.INTERNET" />    
    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >

        <meta-data android:name="com.facebook.sdk.ApplicationId" android:value="@string/facebook_app_id"/>

        <activity
            android:name=".MainActivity"
            android:label="@string/app_name" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>

        <activity android:name="com.facebook.FacebookActivity"
            android:theme="@android:style/Theme.Translucent.NoTitleBar"
            android:configChanges="keyboard|keyboardHidden|screenLayout|screenSize|orientation"
            android:label="@string/app_name" />

        <provider android:authorities="com.facebook.app.FacebookContentProvider1234"
            android:name="com.facebook.FacebookContentProvider"
            android:exported="true"/>

    </application>

</manifest>

MainActivity.java

public class MainActivity extends AppCompatActivity implements View.OnClickListener {
    private static final int ACTION_PICK_IMAGE = 1;

    //Facebook client
    private CallbackManager fb_callbackManager;
    private ShareDialog fb_shareDialog;

    private Button button;
    private ImageView imageView;
    private EditText editText;

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

        // Initialize Facebook API
        FacebookSdk.sdkInitialize(getApplicationContext());
        fb_callbackManager = CallbackManager.Factory.create();

        setContentView(R.layout.activity_main);

        imageView = (ImageView) findViewById(R.id.imageView);
        imageView.setOnClickListener(this);

        editText = (EditText) findViewById(R.id.editText);

        button = (Button) findViewById(R.id.button);
        button.setOnClickListener(this);
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.menu_main, menu);
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        int id = item.getItemId();

        //noinspection SimplifiableIfStatement
        if (id == R.id.action_settings) {
            return true;
        }

        return super.onOptionsItemSelected(item);
    }

    @Override
    public void onClick(View v) {
        switch (v.getId()){
            case R.id.imageView:
                loadImage();
                break;
            case R.id.button:
                share();
                break;
        }
    }

    private void loadImage(){
        Intent photoPickerIntent = new Intent(Intent.ACTION_PICK);
        photoPickerIntent.setType("image/*");
        photoPickerIntent.putExtra("crop", "true");
        photoPickerIntent.putExtra("scale", true);
        photoPickerIntent.putExtra("scaleUpIfNeeded", true);
        photoPickerIntent.putExtra("max-width", 170);
        photoPickerIntent.putExtra("max-height", 160);
        photoPickerIntent.putExtra("aspectX", 1);
        photoPickerIntent.putExtra("aspectY",1);

        startActivityForResult(photoPickerIntent, ACTION_PICK_IMAGE);
    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        if(requestCode == ACTION_PICK_IMAGE) {
            if (resultCode == RESULT_OK) {
                Bundle extras = data.getExtras();
                //get the cropped bitmap
                Bitmap thePic = extras.getParcelable("data");
                imageView.setImageBitmap(thePic);
            }
        }
    }

    protected void share(){
        String shareText = editText.getText().toString();
        ShareDialog shareDialog = new ShareDialog(this);
        if (ShareDialog.canShow(SharePhotoContent.class)) {
            shareDialog.registerCallback(fb_callbackManager, new FacebookCallback<Sharer.Result>() {
                @Override
                public void onSuccess(Sharer.Result result) {
                    Toast.makeText(MainActivity.this, "Share Success", Toast.LENGTH_SHORT).show();
                    Log.d("DEBUG", "SHARE SUCCESS");
                }

                @Override
                public void onCancel() {
                    Toast.makeText(MainActivity.this, "Share Cancelled", Toast.LENGTH_SHORT).show();
                    Log.d("DEBUG", "SHARE CACELLED");
                }

                @Override
                public void onError(FacebookException exception) {
                    Toast.makeText(MainActivity.this, exception.getMessage(), Toast.LENGTH_LONG).show();
                    Log.e("DEBUG", "Share: " + exception.getMessage());
                    exception.printStackTrace();
                }
            });

            SharePhoto photo = new SharePhoto.Builder()
                    .setBitmap(((BitmapDrawable) imageView.getDrawable()).getBitmap())
                    .build();
            SharePhotoContent content = new SharePhotoContent.Builder()
                    .addPhoto(photo)
                    .build();

            shareDialog.show(content);
        }

    }
}

什么都没有显示,或者至少不可见,因为我在尝试在 Facebook 上分享后必须回击才能再次与我的活动互动。

Logcat 上没有记录 DEBUG 字符串。所以我知道 ShareDialog 可以显示照片内容。

有人可以发布一个使用 Facebook for SDK 4.0(android) 共享图像的简单工作示例吗?

【问题讨论】:

    标签: android facebook


    【解决方案1】:

    您需要将 Internet 权限添加到您的 android 清单才能共享工作!

    <manifest xlmns:android...>
        ...
        <uses-permission android:name="android.permission.INTERNET" />
        <application ...
    </manifest>
    

    编辑

    public class MainActivity extends AppCompatActivity {
    
        private CallbackManager callbackManager;
        private LoginManager manager;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
    
            FacebookSdk.sdkInitialize(getApplicationContext());
    
            callbackManager = CallbackManager.Factory.create();
    
            List<String> permissionNeeds = Arrays.asList("publish_actions");
    
            manager = LoginManager.getInstance();
    
            manager.logInWithPublishPermissions(this, permissionNeeds);
    
            manager.registerCallback(callbackManager, new  FacebookCallback<LoginResult>()
           {
                @Override
                public void onSuccess(LoginResult loginResult)
                {
                    publishImage();
                }
    
                @Override
                public void onCancel()
                {
                   System.out.println("onCancel");
                }
    
                @Override
                public void onError(FacebookException exception)
                {
                    System.out.println("onError");
                }
            });
         }
    
         private void publishImage(){
             Bitmap image = BitmapFactory.decodeResource(getResources(),     R.mipmap.ic_launcher);
    
             SharePhoto photo = new SharePhoto.Builder()
                .setBitmap(image)
                .setCaption("Welcome To Facebook Photo Sharing on steroids!")
                .build();
    
             SharePhotoContent content = new SharePhotoContent.Builder()
                .addPhoto(photo)
                .build();
    
             ShareApi.share(content, null);
    
        }
    
        @Override
        protected void onActivityResult(int requestCode, int responseCode,    Intent data)
         {
           super.onActivityResult(requestCode, responseCode, data);
           callbackManager.onActivityResult(requestCode, responseCode, data);
         }
       }
    

    这段代码将一张图片发布到 Facebook 墙上。您可能想要做的是使用共享对话框;这里我只是直接用标题分享图片,而不使用分享对话框。

    请告诉我你得到了什么!我已经对其进行了测试以确保它可以正常工作。

    【讨论】:

    • 是的,我忘了把它放在示例中。我编辑了问题。但是,这仍然不是问题。
    • 我为你添加了示例代码 - 当我在我的设备上尝试时它可以工作。
    • 太棒了!我在你的帮助下成功了。只有一件事... setCaption() 不再可用,我不知道如何共享图片和文本。而且,当然,使用 ShareDialog 会好得多。无论如何,你的答案是正确的,我将其标记为正确。
    • 我很高兴它成功了。稍后我将使用共享对话框进行测试,然后通知您!
    • 哦!我已经做了。确实如此,不起作用的是设置图像标题。它绝对不再可用......虽然我在某处读到这是一个已知问题,他们正计划解决它
    【解决方案2】:

    如果您通过 Android 版 Facebook 应用分享链接、图片或视频,您还需要在 ma​​nifest 中声明 FacebookContentProvider,例如:

    <provider android:authorities="com.facebook.app.FacebookContentProvider1234"
              android:name="com.facebook.FacebookContentProvider"
              android:exported="true" />
    

    在上面的第 1 行中,您将看到一个数字 1234,在 FacebookContentProvider1234 中,您需要将其替换为您的 Facebook 应用 ID。

    【讨论】:

    • 感谢您的帮助@penguin,但我已经这样做了。不工作。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-11
    • 2017-07-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多