2013-04-29 4 views
0

Привет Я знаю, что много людей задают этот вопрос, но ни один из них не мог помочь мне, это то, что я хочу, это как сделать кнопку OnClick должна начать фото Chooser и загрузите выбранное изображение в facebook?Загрузить фото к facebook

Я действительно застрял, и ни один из ответов не помог мне. У меня есть код, который отправляет текст и работает нормально. Но теперь я хочу загрузить изображение тоже, так как я могу это сделать? Кто-нибудь может мне помочь?

наилучшими пожеланиями

UPDATE -> Это то, что я должен размещать

public class TestPost extends Activity{ 
private Facebook mFacebook; 
private CheckBox mFacebookCb; 
private ProgressDialog mProgress; 

private Handler mRunOnUi = new Handler(); 

private static final String APP_ID = "app id here"; 

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

    setContentView(R.layout.post); 

    final EditText reviewEdit = (EditText) findViewById(R.id.revieew); 
    mFacebookCb    = (CheckBox) findViewById(R.id.cb_facebook); 

    mProgress = new ProgressDialog(this); 

    mFacebook = new Facebook(APP_ID); 

    SessionStore.restore(mFacebook, this); 

    if (mFacebook.isSessionValid()) { 
     mFacebookCb.setChecked(true); 

     String name = SessionStore.getName(this); 
     name  = (name.equals("")) ? "Unknown" : name; 

     mFacebookCb.setText(" Facebook (" + name + ")"); 
    } 

    ((Button) findViewById(R.id.button1)).setOnClickListener(new OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      String review = reviewEdit.getText().toString(); 

      if (review.equals("")) return; 

      if (mFacebookCb.isChecked()) postToFacebook(review); 
     } 
    }); 
    private void postToFacebook(String review) { 
    mProgress.setMessage("Posting ..."); 
    mProgress.show(); 

    AsyncFacebookRunner mAsyncFbRunner = new AsyncFacebookRunner(mFacebook); 

    Bundle params = new Bundle(); 

    params.putString("message", review); 
    params.putString("name", "Dexter"); 
    params.putString("caption", "londatiga.net"); 
    params.putString("link", "http://www.londatiga.net"); 
    params.putString("description", "Dexter, seven years old dachshund who loves to catch cats, eat carrot and krupuk"); 
    params.putString("picture", "http://twitpic.com/show/thumb/6hqd44"); 

    mAsyncFbRunner.request("me/feed", params, "POST", new WallPostListener()); 
} 

private final class WallPostListener extends BaseRequestListener { 
    public void onComplete(final String response) { 
     mRunOnUi.post(new Runnable() { 
      @Override 
      public void run() { 
       mProgress.cancel(); 

       Toast.makeText(TestPost.this, "Posted to Facebook", Toast.LENGTH_SHORT).show(); 
      } 
     }); 
    } 

} } 

Update 2 -> LogCat и ошибка apper

04-30 12:45:02.471: W/Bundle(29461): Key method expected byte[] but value was a java.lang.String. The default value <null> was returned. 
    04-30 12:45:02.476: W/Bundle(29461): Attempt to cast generated internal exception: 
    04-30 12:45:02.476: W/Bundle(29461): java.lang.ClassCastException: java.lang.String 
    04-30 12:45:02.476: W/Bundle(29461): at android.os.Bundle.getByteArray(Bundle.java:1305) 
    04-30 12:45:02.476: W/Bundle(29461): at com.facebook.android.Util.openUrl(Util.java:155) 
    04-30 12:45:02.476: W/Bundle(29461): at com.facebook.android.Facebook.request(Facebook.java:559) 
    04-30 12:45:02.476: W/Bundle(29461): at com.facebook.android.AsyncFacebookRunner$2.run(AsyncFacebookRunner.java:208) 
    04-30 12:45:02.476: W/Bundle(29461): Key format expected byte[] but value was a java.lang.String. The default value <null> was returned. 
    04-30 12:45:02.476: W/Bundle(29461): Attempt to cast generated internal exception: 
    04-30 12:45:02.476: W/Bundle(29461): java.lang.ClassCastException: java.lang.String 
    04-30 12:45:02.476: W/Bundle(29461): at android.os.Bundle.getByteArray(Bundle.java:1305) 
    04-30 12:45:02.476: W/Bundle(29461): at com.facebook.android.Util.openUrl(Util.java:155) 
    04-30 12:45:02.476: W/Bundle(29461): at com.facebook.android.Facebook.request(Facebook.java:559) 
    04-30 12:45:02.476: W/Bundle(29461): at com.facebook.android.AsyncFacebookRunner$2.run(AsyncFacebookRunner.java:208) 
    04-30 12:45:02.476: W/dalvikvm(29461): threadid=10: thread exiting with uncaught exception (group=0x4001e578) 
    04-30 12:45:02.476: E/AndroidRuntime(29461): FATAL EXCEPTION: Thread-11 
    04-30 12:45:02.476: E/AndroidRuntime(29461): java.lang.NullPointerException 
    04-30 12:45:02.476: E/AndroidRuntime(29461): at java.net.URLDecoder.decode(URLDecoder.java:104) 
    04-30 12:45:02.476: E/AndroidRuntime(29461): at java.net.URLDecoder.decode(URLDecoder.java:48) 
    04-30 12:45:02.476: E/AndroidRuntime(29461): at com.facebook.android.Util.openUrl(Util.java:167) 
    04-30 12:45:02.476: E/AndroidRuntime(29461): at com.facebook.android.Facebook.request(Facebook.java:559) 
    04-30 12:45:02.476: E/AndroidRuntime(29461): at com.facebook.android.AsyncFacebookRunner$2.run(AsyncFacebookRunner.java:208) 

* Это звонок *

((Button) findViewById(R.id.upload)).setOnClickListener(new OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      try{ 
      selectImage(); 
        } 
      catch (Exception e) { 
        Toast toast = Toast.makeText(TestPost.this, "Unable to retrieve the selected image.", Toast.LENGTH_LONG); 
        toast.show(); 
       } finally { 
       } 
      } 
    }); 
    } 

Вот // TODO: загрузить в альбомы Facebook

private void uploadImageBytes(byte[] bytes) { 
    // TODO: upload to Facebook albums 

      Bundle params = new Bundle(); 
      params.putString(Facebook.TOKEN, mFacebook.getAccessToken()); 
      params.putString("method", "photos.upload"); 
      params.putByteArray("picture", bytes); 

      AsyncFacebookRunner mAsyncRunner = new AsyncFacebookRunner(mFacebook); 
      mAsyncRunner.request(null, params, "POST", new WallPostListener()); 
} 

Solution Thx к #vorrtex с ответившим вопросом belowed он объяснил мне этот вопрос с его кодом, который я получил его Работа. вот полный код для других, если они будут нуждаться в это в будущем

кнопка вызывает метод

((Button) findViewById(R.id.upload)).setOnClickListener(new OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      try{ 
      selectImage(); 
        } 
      catch (Exception e) { 
        Toast toast = Toast.makeText(TestPost.this, "Unable to retrieve the selected image.", Toast.LENGTH_LONG); 
        toast.show(); 
       } finally { 
       } 
      } 
    }); 

А вот способ и поток кодов. Код от ответившего вопрос

private void selectImage() { 

    Intent i = new Intent(Intent.ACTION_GET_CONTENT); 
    i.setType("image/*"); 
    this.startActivityForResult(i, REQUEST_CODE_GALLERY); 
} 

@Override 
protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
    if (resultCode == RESULT_OK) { 
     switch (requestCode) { 
      case REQUEST_CODE_GALLERY: 

       Uri selectedImage = data.getData(); 
       String filePath = null; 

       String[] columns = { MediaColumns.DATA }; 
       Cursor cursor = this.getContentResolver().query(selectedImage, columns, null, null, null); 
       if (cursor != null) { 
        cursor.moveToFirst(); 

        int columnIndex = cursor.getColumnIndex(columns[0]); 
        filePath = cursor.getString(columnIndex); 

        if (!cursor.isClosed()) { 
         cursor.close(); 
        } 
       } else { 
        filePath = selectedImage.getPath(); 
       } 

       if (filePath != null) { 
        this.uploadImagePath(filePath); 
       } else { 
        Toast toast = Toast.makeText(this, "Unable to retrieve the selected image.", Toast.LENGTH_LONG); 
        toast.show(); 
       } 

       break; 
     } 
    } 
} 

private void uploadImagePath(String filePath) { 
    FileInputStream fileStream = null; 
    try { 
     fileStream = new FileInputStream(new File(filePath)); 
     byte[] bytes = convertStreamToBytes(fileStream); 
     this.uploadImageBytes(bytes); 
     placering = filePath; 
    } catch (Exception e) { 
     Toast toast = Toast.makeText(this, "Unable to retrieve the selected image.", Toast.LENGTH_LONG); 
     toast.show(); 
    } finally { 
     closeStream(fileStream); 
    } 
} 

private void uploadImageBytes(byte[] bytes) { 
    // TODO: upload to Facebook albums 

    Bundle params = new Bundle(); 
    params.putString(Facebook.TOKEN, mFacebook.getAccessToken()); 
    params.putString("method", "photos.upload"); 
    params.putByteArray("picture", bytes); 

    AsyncFacebookRunner mAsyncRunner = new AsyncFacebookRunner(mFacebook); 
    mAsyncRunner.request(null, params, "POST", new WallPostListener()); 
} 


public static byte[] convertStreamToBytes(InputStream stream) throws IOException { 
    if (stream == null) { 
     return null; 
    } 

    ByteArrayOutputStream output = new ByteArrayOutputStream(); 

    copyStream(stream, output); 

    return output.toByteArray(); 
} 

public static void copyStream(InputStream from, OutputStream to) throws IOException { 
    byte data[] = new byte[8192]; 
    int count; 

    while ((count = from.read(data)) != -1) { 
     to.write(data, 0, count); 
    } 

    from.close(); 
} 

public static void closeStream(Closeable stream) { 
    try { 
     if (stream != null) { 
      stream.close(); 
     } 
    } catch (Exception e) { 

    } 
} 
+0

Я обновил этот вопрос, я пытался следовать некоторым ответам здесь, на StackOverflow, но большинство из них, как с данным путем, но я хочу, чтобы пользователь выбрать изображение для публикации – Tirolel

ответ

1

Ниже приведены ответы, как начать фото Chooser: How to pick an image from gallery (SD Card) for my app?

Затем вы должны загрузить выбранное изображение в альбом Facebook (/me/photos). Вы должны сделать это, потому что me/feed принимает только строки URL, а не бинарные изображения, поэтому вы загружаете свое изображение, чтобы у вас была строка URL-адреса.

Ответьте, пожалуйста, как это сделать: Android - Upload photo to Facebook with Facebook Android SDK. Вы должны заменить '/sdcard/viewitems.png' на путь к файлу, выбранный из галереи.

Тогда вы можете разместить ссылку на загруженное изображение:

// the onComplete method from the previous link 
final String src = json.getString("src"); 

// ... create params ... 
params.putString("picture", src); 

mAsyncFbRunner.request("me/feed", params, "POST", new WallPostListener()); 

Edit: Кстати, ответы из первой ссылки не являются полными и не хорошо, так вот полный код, как выбрать изображение из галереи и преобразовать его в байты:

private void selectImage() { 
    Intent i = new Intent(Intent.ACTION_GET_CONTENT); 
    i.setType("image/*"); 
    this.startActivityForResult(i, Constants.REQUEST_CODE_GALLERY); 
} 

@Override 
protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
    if (resultCode == RESULT_OK) { 
     switch (requestCode) { 
      case Constants.REQUEST_CODE_GALLERY: 

       Uri selectedImage = data.getData(); 
       String filePath = null; 

       String[] columns = { MediaColumns.DATA }; 
       Cursor cursor = this.getContentResolver().query(selectedImage, columns, null, null, null); 
       if (cursor != null) { 
        cursor.moveToFirst(); 

        int columnIndex = cursor.getColumnIndex(columns[0]); 
        filePath = cursor.getString(columnIndex); 

        if (!cursor.isClosed()) { 
         cursor.close(); 
        } 
       } else { 
        filePath = selectedImage.getPath(); 
       } 

       if (filePath != null) { 
        this.uploadImagePath(filePath); 
       } else { 
        Toast toast = Toast.makeText(this, "Unable to retrieve the selected image.", Toast.LENGTH_LONG); 
        toast.show(); 
       } 

       break; 
     } 
    } 
} 

private void uploadImagePath(String filePath) { 
    FileInputStream fileStream = null; 
    try { 
     fileStream = new FileInputStream(new File(filePath)); 
     byte[] bytes = convertStreamToBytes(fileStream); 
     this.uploadImageBytes(bytes); 
    } catch (Exception e) { 
     Toast toast = Toast.makeText(this, "Unable to retrieve the selected image.", Toast.LENGTH_LONG); 
     toast.show(); 
    } finally { 
     closeStream(fileStream); 
    } 
} 

private void uploadImageBytes(byte[] bytes) { 
    // TODO: upload to Facebook albums 
} 

public static byte[] convertStreamToBytes(InputStream stream) throws IOException { 
    if (stream == null) { 
     return null; 
    } 

    ByteArrayOutputStream output = new ByteArrayOutputStream(); 

    copyStream(stream, output); 

    return output.toByteArray(); 
} 

public static void copyStream(InputStream from, OutputStream to) throws IOException { 
    byte data[] = new byte[8192]; 
    int count; 

    while ((count = from.read(data)) != -1) { 
     to.write(data, 0, count); 
    } 

    from.close(); 
} 

public static void closeStream(Closeable stream) { 
    try { 
     if (stream != null) { 
      stream.close(); 
     } 
    } catch (Exception e) { 
     Log.e(TAG, e); 
    } 
} 
+0

ссылки, которые вы указываете, верны, но байты следует вводить в параметры, а не только по пути. –

+0

@Показать ответ со второй ссылки использует такие методы, как 'BitmapFactory.decodeFile' и' data = baos.toByteArray() ', поэтому путь преобразуется в массив байтов, который используется впоследствии. – vorrtex

+0

Согласен. ByteArray следует использовать, а не String. –