2012-07-31 11 views
5

मैं अपने एंड्रॉइड ऐप में एक बटन बनाने की कोशिश कर रहा हूं जो उपयोगकर्ता को सोशल मीडिया नेटवर्क की अपनी पसंद का उपयोग करके एक छवि साझा करने की अनुमति देता है। छवि फ़ाइल ऐप के संपत्ति फ़ोल्डर में संग्रहीत है।एंड्रॉइड: मैसेजिंग, जी +, ट्विटर, फेसबुक के माध्यम से संपत्तियों से संपत्ति को विश्वसनीय रूप से साझा करें?

मेरी योजना छवि पर बाहरी पहुंच देने के लिए कस्टम सामग्री प्रदाता को लागू करना है, फिर मेरे सामग्री प्रदाता के भीतर छवि के यूरी को निर्दिष्ट करने वाला TYPE_SEND इरादा भेजें।

मैंने यह किया है और यह Google+ और जीमेल के लिए काम करता है, लेकिन अन्य सेवाओं के लिए यह विफल रहता है। सबसे कठिन हिस्सा मुझे अपने ContentProvider की क्वेरी() विधि से वापस लौटने के बारे में जानकारी प्राप्त कर रहा है। कुछ ऐप्स एक प्रक्षेपण निर्दिष्ट करते हैं (उदा। Google+ _id और _data के लिए पूछता है), जबकि कुछ ऐप्स प्रक्षेपण के रूप में शून्य हो जाते हैं। यहां तक ​​कि प्रक्षेपण निर्दिष्ट किया गया है, मुझे नहीं पता कि कॉलम में वास्तविक डेटा (प्रकार) की अपेक्षा की जाती है। मुझे इस पर कोई दस्तावेज नहीं मिल रहा है।

मैंने ContentProvider की openAssetFile विधि भी लागू की है और इसे कॉल किया जाता है (Google+ द्वारा दो बार!) लेकिन फिर अनिवार्य रूप से क्वेरी विधि भी कॉल की जाती है। क्वेरी विधि का नतीजा केवल गिनती प्रतीत होता है।

कोई विचार जहां मैं गलत हो रहा हूं? मुझे अपनी क्वेरी विधि से क्या लौटना चाहिए?

नीचे कोड:

// my intent 

Intent i = new Intent(android.content.Intent.ACTION_SEND); 
i.setType("image/jpeg"); 
Uri uri = Uri.parse("content://com.me.provider/ic_launcher.jpg"); 
i.putExtra(Intent.EXTRA_STREAM, uri);  
i.putExtra(android.content.Intent.EXTRA_TEXT, text); 
startActivity(Intent.createChooser(i, "Share via")); 

// my custom content provider 

public class ImageProvider extends ContentProvider 
{ 
private AssetManager _assetManager; 

public static final Uri CONTENT_URI = Uri.parse("content://com.me.provider"); 

// not called 
@Override 
public int delete(Uri arg0, String arg1, String[] arg2) 
{ 
    return 0; 
} 

// not called 
@Override 
public String getType(Uri uri) 
{ 
    return "image/jpeg"; 
} 

// not called 
@Override 
public Uri insert(Uri uri, ContentValues values) 
{ 
    return null; 
} 

@Override 
public boolean onCreate() 
{ 
    _assetManager = getContext().getAssets(); 
    return true; 
} 

@Override 
public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) 
{ 
    MatrixCursor c = new MatrixCursor(new String[] { "_id", "_data" }); 

    try 
    { 
        // just a guess!! works for g+ :/ 
     c.addRow(new Object[] { "ic_launcher.jpg", _assetManager.openFd("ic_launcher.jpg") }); 
    } catch (IOException e) 
    { 
     e.printStackTrace(); 
     return null; 
    } 

    return c; 
} 

// not called 
@Override 
public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs) 
{ 
    return 0; 
} 

// not called 
@Override 
public String[] getStreamTypes(Uri uri, String mimeTypeFilter) 
{ 

    return new String[] { "image/jpeg" }; 
} 

// called by most apps 
@Override 
public AssetFileDescriptor openAssetFile(Uri uri, String mode) throws FileNotFoundException 
{ 

    try 
    { 
     AssetFileDescriptor afd = _assetManager.openFd("ic_launcher.jpg"); 
     return afd; 
    } catch (IOException e) 
    { 
     throw new FileNotFoundException("No asset found: " + uri); 
    } 
} 

// not called 
@Override 
public ParcelFileDescriptor openFile(Uri uri, String mode) 
     throws FileNotFoundException 
{ 

    return super.openFile(uri, mode); 
} 

}

+0

क्या आप इसे समझने में सक्षम थे? मैंने अभी तक यह फेसबुक के लिए काम नहीं देखा है। – selsine

उत्तर

1

धन्यवाद, आपके सवाल का हल मेरा;) मैं तुम्हारा बिल्कुल उलटा समस्या हो रही थी: हर सेवा को छोड़कर g + काम करेगा। मैं क्वेरी विधि में शून्य लौट रहा था, जिसने जी + क्रैश बनाया।

वास्तव में मेरी छवियों का पर्दाफाश करने की एकमात्र चीज openFile() लागू करना था। मेरी फाइलें फाइल सिस्टम पर संग्रहीत हैं, संपत्तियों में नहीं, लेकिन मुझे लगता है कि आप को अपने AssetFileDescriptor से ParcelFileDescriptor प्राप्त कर सकते हैं और इसे वापस कर सकते हैं। मेरे openFile() विधि इस प्रकार है:

@Override 
public ParcelFileDescriptor openFile(Uri uri, String mode) 
     throws FileNotFoundException { 
    String path = uri.getLastPathSegment(); 
    if (path == null) { 
     throw new IllegalArgumentException("Not a Path"); 
    } 
    File f = new File(getContext().getFilesDir() + File.separator + "solved" + path + ".jpg"); 
    int iMode; 
    if ("r".equals(mode)) { 
     iMode = ParcelFileDescriptor.MODE_READ_ONLY; 
    } else if ("rw".equals(mode)) { 
     iMode = ParcelFileDescriptor.MODE_READ_WRITE; 
    } else if ("rwt".equals(mode)) { 
     iMode = ParcelFileDescriptor.MODE_READ_WRITE | ParcelFileDescriptor.MODE_TRUNCATE; 
    } else { 
     throw new IllegalArgumentException("Invalid mode"); 
    }  
    return ParcelFileDescriptor.open(f, iMode); 
} 

यह हर सेवा मैं छोड़कर g + ACTION_SEND उद्देश्य के साथ स्थापित किया है के लिए काम करता है। आपकी क्वेरी विधि का उपयोग करके यह Google प्लस के लिए भी काम करता है।

+0

क्या आप कृपया मेरी मदद कर सकते हैं मैं सामग्री प्रदाता का उपयोग कर छवि संलग्न करने में असमर्थ हूं, एफबी, ब्लूटूथ, ट्विटर इत्यादि। – user3233280