2015-04-30 3 views
2

Попытка поделиться изображением с помощью Facebook SDK 4.0 для Android.Android Sharing на Facebook (SDK 4)

app.graddle

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.

Ни одна строка DEBUG не зарегистрирована на Logcat. Поэтому я понимаю, что ShareDialog может показывать содержимое фото.

Может ли кто-нибудь опубликовать простой рабочий пример совместного использования изображений с Facebook для SDK 4.0 (android)?

ответ

5

Вам необходимо добавить разрешение Интернета на ваш манифест android для совместного использования!

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

EDIT

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 стене. То, что вы, возможно, захотите сделать, это использовать диалог совместного доступа; здесь я просто передаю изображение напрямую с надписью без использования диалогового окна совместного доступа.

Пожалуйста, дайте мне знать, что вы получаете! Я проверил его, чтобы убедиться, что он работает.

+0

Правда, я забыл поместить его в образец. Я редактировал вопрос. Но все-таки, это не проблема. – Jared

+0

Я добавил пример кода для вас - он работает, когда я пытаюсь на своем устройстве. – Eenvincible

+0

Отлично! Я сделал это с вашей помощью. Только одно ... setCaption() больше не доступно, я не знаю, как я мог бы поделиться изображением и текстом. И, определенно, использование ShareDialog было бы намного лучше. Во всяком случае, ваш ответ правильный, и я отмечаю его как таковой. – Jared

3

Если вы публикуете ссылки, изображения или видео через Facebook для Android приложения, вы также должны объявить FacebookContentProvider в манифеста, как:

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

В выше линии № 1 вы увидите номер 1234, в FacebookContentProvider1234, вам нужно заменить его на свой идентификатор приложения Facebook.

+0

Спасибо за помощь @penguin, но я уже это сделал. Не работает. – Jared

Смежные вопросы