Привет Я знаю, что много людей задают этот вопрос, но ни один из них не мог помочь мне, это то, что я хочу, это как сделать кнопку 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) {
}
}
Я обновил этот вопрос, я пытался следовать некоторым ответам здесь, на StackOverflow, но большинство из них, как с данным путем, но я хочу, чтобы пользователь выбрать изображение для публикации – Tirolel