2012-01-26 32 views
19

Ứng dụng của tôi tạo hình ảnh mà người dùng có thể lưu hoặc chia sẻ với người khác. Mã bên dưới hoạt động với hầu hết các ứng dụng: Messenger, Facebook, Dropbox, email, v.v. Ý nghĩa, hình ảnh được tải bởi ứng dụng đã chọn và người dùng có thể chia sẻ hình ảnh thành công với ứng dụng đó.Chia sẻ hình ảnh với ứng dụng Google+ bằng cách sử dụng Intent.ACTION_SEND và Intent.EXTRA_STREAM

Intent intent = new Intent(Intent.ACTION_SEND); 
intent.setType("image/png"); 
File o = new File(dir, "file.png"); 
intent.putExtra(Intent.EXTRA_STREAM, Uri.fromFile(o)); 
startActivity(Intent.createChooser(intent , "Send options")); 

Tuy nhiên, khi tôi chọn Google+ trong danh sách ứng dụng, google + bắt đầu, nhưng hình ảnh không được bao gồm trong cửa sổ bài đăng. Thay vào đó, google + sẽ hiển thị một thông điệp Toast với:

"You can only post photos stored on your device." 

Đây là một chút bối rối, bởi vì hình ảnh trên thẻ SD bên ngoài, ví dụ: /mnt/sdcard/AppDir/file.png. Tôi đang sử dụng bản cập nhật mới nhất của ứng dụng Google+ (2.3.1.242969).

Có mẹo nào khác để chia sẻ hình ảnh với google + không?

Cảm ơn bạn.

UPDATE:

Ứng dụng của tôi tạo ra những hình ảnh được chia sẻ, vì vậy các mẫu dưới đây từ @ Chirag-shah là không trực tiếp áp dụng. Nhưng, bằng cách sử dụng MediaStore trông giống như ý tưởng đúng. Tôi đã giải quyết trên mã cơ bản bên dưới:

void shareImage(int position) { 
    File f = getFileFor(position); 
    ContentValues values = new ContentValues(2); 
    values.put(MediaStore.Images.Media.MIME_TYPE, "image/png"); 
    values.put(MediaStore.Images.Media.DATA, f.getAbsolutePath()); 
    Uri uri = getContentResolver().insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, values); 
    Intent intent = new Intent(Intent.ACTION_SEND); 
    intent.setType("image/png"); 
    intent.putExtra(Intent.EXTRA_STREAM, uri); 
    startActivity(Intent.createChooser(intent , "Send options")); 
} 

Điều này hoạt động với Google+ và tất cả các ứng dụng khác mà tôi đã thử nghiệm. Tôi để câu hỏi mở trong trường hợp đây không phải là cách thực hành tốt nhất. Bất cứ ai có thể xác nhận rằng đây là đúng cách để làm điều đó?

Trả lời

9

Bắt tuyệt vời! Bạn có thể chỉ định MediaStore Uri (trông giống như nội dung: // media/external/images/media/42) thay vì đường dẫn tuyệt đối trên hệ thống tệp.

Ví dụ:

public class MyActivity extends Activity { 
    ... 
    static final int IMAGE_REQUEST = 0; 

    protected void pickImage() { 
    Intent intent = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE); 
    startActivityForResult(intent, IMAGE_REQUEST); 
    } 

    protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
    if (requestCode == IMAGE_REQUEST) { 
     Uri uri = data.getData(); 

     Intent intent = new Intent(Intent.ACTION_SEND); 
     intent.setType("image/png"); 
     // uri looks like content://media/external/images/media/42 
     intent.putExtra(Intent.EXTRA_STREAM, uri); 
     startActivity(Intent.createChooser(intent , "Share")); 
    } 
    } 
} 
+0

Cảm ơn bạn về mẹo này. Sử dụng Media Store trông giống như một cách phù hợp để đi và bài đăng của bạn đã cho tôi ý tưởng đó. –

2

Lý do tại sao bạn đang nhận được lỗi này là vì "trên thẻ sd" KHÔNG "trên thiết bị của bạn".

Một cuộc thảo luận về vấn đề này có thể được tìm thấy ở đây: https://groups.google.com/a/googleproductforums.com/forum/#!topic/google-plus-discuss/pdlOTM8JEXg/discussion

Cách giải quyết thông qua MediaStore có vẻ là giải pháp duy nhất cho đến khi Google cập nhật ứng dụng Google+ với một sửa chữa.

Cập nhật: Giải pháp được đề cập ở trên chỉ hoạt động nếu bạn muốn chia sẻ hình ảnh một lần. Nếu bạn gọi ContentResolver.insert (...) nhiều lần, bạn sẽ kết thúc với hình ảnh hiển thị nhiều lần trong bộ sưu tập của bạn. Tôi đã đưa ra các giải pháp sau đây mà cố gắng để có được id hiện của hình ảnh và nếu nó không tồn tại, bạn có thể chèn nó ...

Cursor c = getActivity().getContentResolver() 
      .query(Images.Media.EXTERNAL_CONTENT_URI, 
        null, 
        Images.Media.DATA + "=?", 
        new String[] { filePath }, null); 
    if (c.getCount() > 0 && c.moveToFirst()) { 
     Uri shareUri = Uri.withAppendedPath(
       Images.Media.EXTERNAL_CONTENT_URI, 
       "" 
         + c.getInt(c 
           .getColumnIndex(Images.Media._ID))); 
     c.close(); 

     startActivity(Intent.createChooser(
       new Intent(Intent.ACTION_SEND) 
         .putExtra(Intent.EXTRA_STREAM, 
           shareUri).setType(
            "image/*"), "")); 
    } else { 
    // ContentResolver.insert(...) and use that uri... 
    } 
+0

Dường như điều này không phải lúc nào cũng hoạt động: http: // stackoverflow.com/questions/23324485/android-mediastore-cant-get-chèn-hình ảnh-dữ liệu –

3

Cảm ơn để nâng cao câu hỏi này!

Có vẻ như Google+ chỉ chấp nhận phương tiện từ nhà cung cấp nội dung (nội dung: // uris), không phải tệp: // uris. Vì vậy, chúng ta cần đưa hình ảnh vào MediaStore trước. Một cách dễ dàng hơn để thực hiện việc này là:

MediaStore.Images.Media.insertImage(context.getContentResolver(), tmpFile.getAbsolutePath(), tmpFile.getName(), null); 
Các vấn đề liên quan