Android / Google Plus – No puedo compartir la imagen de mi proveedor de contenido

He utilizado este código y puedo compartir con éxito una imagen (desde la galería de mi teléfono) con texto a google + de mi aplicación para Android.

Sin embargo, cuando intento publicar una imagen del proveedor de contenido de mi aplicación, la imagen aparece en mi página de google + como esta …

Introduzca aquí la descripción de la imagen

… y eso es a pesar de la imagen pretendida que se muestra bien en la pantalla de vista previa de google + aplicación.

El código que estoy usando para compartir es:

String message = "My message"; Uri localImageUri = ContentUris.withAppendedId(DbContentProvider.CONTENT_URI_PRODUCTS, mProductId; PlusShare.Builder builder = new PlusShare.Builder(getActivity()); builder.setText(message); builder.addStream(localImageUri); builder.setType("image/jpeg"); Intent shareIntent = builder.getIntent(); startActivityForResult(shareIntent, RC_GOOGLE_PLUS); 

… y, como digo, la imagen se muestra con éxito en la página final de google + si el valor localImageUri es para un recurso en la Galería de mi teléfono, mientras que la imagen de marcador de posición anterior se muestra si establezco localImageUri en un uri de mi propia aplicación proveedor de contenido.

Así que presumo que debe haber un problema con mi proveedor de contenido, que se define en mi manifiesto como:

 <provider android:name=".DbContentProvider" android:authorities="com.example.provider" android:exported="true" android:grantUriPermissions="true" /> 

Por lo tanto, podría haber algo que falta en mi manifefst – o incluso de mi archivo searchable.xml:

 <?xml version="1.0" encoding="utf-8"?> <searchable xmlns:android="http://schemas.android.com/apk/res/android" android:label="@string/app_name" android:hint="@string/search_hint" android:searchSuggestAuthority="com.example.provider" android:searchSuggestIntentAction="android.intent.action.VIEW" android:searchSuggestIntentData="content://com.example.provider/suggest" android:searchSuggestThreshold="3" android:includeInGlobalSearch="true" android:searchSettingsDescription="@string/search_settings_description" android:queryAfterZeroResults="true" android:voiceSearchMode="showVoiceSearchButton" > </searchable> 

Si no, entonces ¿cuál podría ser el problema?

Actualización (Siguiendo el comentario de CommonsWare)

Excepciones fueron lanzadas por la biblioteca de Google+ porque al hacer una consulta en la columna _data (que existía), la API de Google+ también estaba buscando columnas que no existían, a saber, datetaken , date_added , date_modified .

Por lo tanto, he añadido estas columnas a mi tabla de base de datos, agregándolas todas como columnas de text con valores de '1419379390000' recientes como '1419379390000' (ref aquí ), pero todavía obtengo la misma imagen de marcador de posición que se muestra en mi página de Google+.

Así que agregué algún código de registro al método query() de mi clase DbContentProvider y cuando google + hace su consulta de una sola columna para datetaken , el valor devuelto en el cursor es realmente 1419379390000. Sin embargo, el valor devuelto para la consulta (separada) _data Es null .

No estoy seguro de por qué la API de google consulta la columna _data (porque no necesito llamarla en mi código cuando recupero la imagen de la base de datos con el fin de mostrar en la interfaz de usuario – en lugar de …

 Uri localImageUri = ContentUris.withAppendedId(DbContentProvider.CONTENT_URI_PRODUCTS, mProductId); InputStream in = cr.openInputStream(localImageUri); Bitmap img = BitmapFactory.decodeStream(in); imageView.setImageBitmap(img); 

… pero presumiblemente el nulo en mi cursor para el valor _data es el problema. No estoy seguro de por dónde empezar a abordar esto, aunque ??

Actualización 30-Dec-2014

Aquí está la salida LogCat. Así que, cuando haga clic en mi botón de g + …

 12-30 21:45:34.344: D/DbContentProvider(24633): getType(content://com.example.provider/products/1668) 12-30 21:45:34.534: D/DbContentProvider(24633): getType(content://com.example.provider/products/1668) 12-30 21:45:34.544: D/DbContentProvider(24633): openFile(content://com.example.provider/products/1668, r) 12-30 21:45:34.584: D/DbContentProvider(24633): openFile(content://com.example.provider/products/1668, r) 12-30 21:45:34.604: D/DbContentProvider(24633): openFile(content://com.example.provider/products/1668, r) 12-30 21:45:34.604: D/DbContentProvider(24633): openFile(content://com.example.provider/products/1668, r) 12-30 21:45:34.624: D/DbContentProvider(24633): openFile(content://com.example.provider/products/1668, r) 

… que trae la pantalla g + para personalizar el mensaje de compartir (que, confirmo, incluye la imagen de mi proveedor de contenido). Entonces hago clic en el botón Compartir en la pantalla g + y la salida LogCat es …

 12-30 21:45:57.526: D/DbContentProvider(24633): openFile(content://com.example.provider/products/1668, r) 12-30 21:45:57.576: D/DbContentProvider(24633): getType(content://com.example.provider/products/1668) 12-30 21:45:57.576: D/DbContentProvider(24633): DbContentProvider - query(content://com.example.provider/products/1668) 12-30 21:45:57.576: D/DbContentProvider(24633): - projection: {"datetaken"} 12-30 21:45:57.576: D/DbContentProvider(24633): - selection: null 12-30 21:45:57.576: D/DbContentProvider(24633): - selectionArgs: null 12-30 21:45:57.576: D/DbContentProvider(24633): - sortOrder: null 12-30 21:45:57.576: D/DbContentProvider(24633): SQL (without selectionArgs): SELECT datetaken FROM products WHERE (_id = 1668) LIMIT 1 12-30 21:45:57.596: D/DbContentProvider(24633): returned value: 1419379390000 12-30 21:45:57.596: D/DbContentProvider(24633): cursor count: 1 12-30 21:46:03.642: D/DbContentProvider(24633): getType("content://com.example.provider/products/1668") - returns "vnd.android.cursor.item/vnd.example.elemental" 

Actualización 23-Jan-2015

Aquí está mi manifiesto en su totalidad:

 <?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.example" android:versionCode="10" android:versionName="0.10" > <uses-sdk android:minSdkVersion="11" android:targetSdkVersion="20" /> <uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> <uses-permission android:name="android.permission.GET_ACCOUNTS" /> <uses-permission android:name="android.permission.USE_CREDENTIALS" /> <uses-permission android:name="android.permission.WAKE_LOCK" /> <uses-permission android:name="com.google.android.c2dm.permission.RECEIVE" /> <permission android:name="com.example.permission.C2D_MESSAGE" android:protectionLevel="signature" /> <uses-permission android:name="com.example.permission.C2D_MESSAGE" /> <uses-permission android:name="com.android.vending.BILLING" /> <application android:name=".MyApplication" android:allowBackup="true" android:icon="@drawable/ic_launcher" android:label="@string/app_name" android:theme="@style/AppTheme" > <meta-data android:name="com.google.android.gms.version" android:value="@integer/google_play_services_version" /> <receiver android:name=".GcmBroadcastReceiver" android:permission="com.google.android.c2dm.permission.SEND" > <intent-filter> <action android:name="com.google.android.c2dm.intent.RECEIVE" /> <category android:name="com.example" /> </intent-filter> </receiver> <service android:name=".GcmIntentService" /> <provider android:name=".DbContentProvider" android:authorities="com.example.provider" android:exported="false" android:grantUriPermissions="false" > <grant-uri-permission android:pathPrefix="/products" /> </provider> <activity android:name="com.google.android.gms.ads.AdActivity" android:configChanges="keyboard|keyboardHidden|orientation|screenLayout|uiMode|screenSize|smallestScreenSize" android:theme="@android:style/Theme.Translucent" > <meta-data android:name="com.google.android.gms.version" android:value="@integer/google_play_services_version" /> </activity> <activity android:name=".SplashActivity" android:label="@string/app_name" android:launchMode="singleTop" > <intent-filter android:label="@string/app_name_short"> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> <activity android:name=".LoginActivity" android:label="@string/title_activity_login" android:windowSoftInputMode="stateHidden" > </activity> <activity android:name=".HomeActivity" android:label="@string/app_name_short" android:windowSoftInputMode="adjustPan" > <meta-data android:name="android.app.default_searchable" android:value=".SearchResultsActivity" /> </activity> <activity android:name=".SearchResultsActivity" android:label="@string/app_name_short" android:launchMode="singleTop" android:parentActivityName=".HomeActivity" android:windowSoftInputMode="stateHidden" > <intent-filter> <action android:name="android.intent.action.SEARCH" /> </intent-filter> <meta-data android:name="android.support.PARENT_ACTIVITY" android:value=".HomeActivity" /> <meta-data android:name="android.app.searchable" android:resource="@xml/searchable" /> <meta-data android:name="android.app.default_searchable" android:value=".SearchResultsActivity" /> </activity> <activity android:name=".SingleShoppingListActivity" android:label="@string/shopping_list" android:parentActivityName=".HomeActivity" > <meta-data android:name="android.support.PARENT_ACTIVITY" android:value=".HomeActivity" /> </activity> <activity android:name=".SingleProductActivity" android:label="@string/shopping_list_item" android:parentActivityName=".HomeActivity" > <meta-data android:name="android.support.PARENT_ACTIVITY" android:value=".HomeActivity" /> </activity> <activity android:name=".InfoMenuActivity" android:label="@string/why_gmo_free" android:parentActivityName=".HomeActivity" > <meta-data android:name="android.support.PARENT_ACTIVITY" android:value=".HomeActivity" /> </activity> <activity android:name=".InfoContentActivity" android:label="@string/why_gmo_free" android:parentActivityName=".InfoMenuActivity" > <meta-data android:name="android.support.PARENT_ACTIVITY" android:value=".InfoMenuActivity" /> </activity> <activity android:name=".SettingsActivity" android:label="@string/settings" android:parentActivityName=".HomeActivity" > <meta-data android:name="android.support.PARENT_ACTIVITY" android:value=".HomeActivity" /> </activity> <activity android:name=".TwitterCallbackActivity" android:label="@string/app_name" > <intent-filter> <action android:name="android.intent.action.VIEW" /> <category android:name="android.intent.category.DEFAULT" /> <category android:name="android.intent.category.BROWSABLE" /> <data android:host="twitter" android:scheme="oauth" /> </intent-filter> </activity> <activity android:name=".DummyActivity" android:label="@string/title_activity_dummy" > </activity> <activity android:name=".SmartSearchResultsActivity" android:label="@string/app_name_short" android:parentActivityName=".SearchResultsActivity" android:windowSoftInputMode="stateHidden" > <intent-filter> <action android:name="android.intent.action.SEARCH" /> </intent-filter> <meta-data android:name="android.support.PARENT_ACTIVITY" android:value=".SearchResultsActivity" /> <meta-data android:name="android.app.searchable" android:resource="@xml/searchable" /> <meta-data android:name="android.app.default_searchable" android:value=".SearchResultsActivity" /> </activity> <activity android:name=".WebViewActivity" android:label="@string/app_name_short" android:parentActivityName=".HomeActivity" > <meta-data android:name="android.support.PARENT_ACTIVITY" android:value=".HomeActivity" /> </activity> <activity android:name=".UpgradeActivity" android:label="@string/upgrade_to_pro_qm" > </activity> </application> </manifest> 

One Solution collect form web for “Android / Google Plus – No puedo compartir la imagen de mi proveedor de contenido”

Este es un problema interesante. Si se exporta su ContentProvider (lo cual no está del todo claro en la pregunta, parece que está en el primer fragmento que publicó, pero no en el completo AndroidManifest.xml agregado más tarde), lo que está haciendo debería funcionar. No sé por qué no.

En cualquier caso, ciertamente puede compartir cualquier archivo de imagen en la aplicación de Google+ mediante un FileProvider :

FileProvider es una subclase especial de ContentProvider que facilita el intercambio seguro de archivos asociados con una aplicación creando un content:// Uri para un archivo en lugar de un file:/// Uri.

Por lo tanto, si su imagen es realmente un archivo bajo getFilesDir() (muy probable) o puede ser por lo menos movido allí, entonces usted puede aplicar esta solución.

Primero debe definir el proveedor en su archivo AndroidManifest.xml:

 <provider android:name="android.support.v4.content.FileProvider" android:authorities="com.example.testshare.fileprovider" android:grantUriPermissions="true" android:exported="false"> <meta-data android:name="android.support.FILE_PROVIDER_PATHS" android:resource="@xml/filepaths" /> </provider> 

A continuación, este archivo en res\xml\filepaths.xml :

 <?xml version="1.0" encoding="utf-8"?> <paths> <files-path name="shared_images" path="shared_images/" /> </paths> 

Entonces, para compartir un archivo de imagen, primero asegúrese de que está en la ruta especificada anteriormente (es decir, shared_images en getFilesDir() – no necesita el permiso de WRITE_EXTERNAL_STORAGE para copiar si existe porque esta ubicación se encuentra dentro del área de almacenamiento privado de su propia aplicación) . A continuación, construya la intención de la acción de la siguiente manera:

 File file = getImageFileToShare(); Uri fileUri = FileProvider.getUriForFile(this, "com.example.testshare.fileprovider", file); Intent intent = new Intent(Intent.ACTION_SEND); intent.putExtra(Intent.EXTRA_STREAM, fileUri); intent.setType("image/png"); intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); startActivity(intent); 

(Asegúrese de que la autoridad especificada en el método getUriForFile() coincide con la del manifiesto).

Esto producirá un content:// Uri (como content://com.example.testshare.fileprovider/shared_images/img1.png que la aplicación de Google+ podrá acceder y, por lo tanto, incluir en la publicación).

  • La aplicación no se registra en el menú "Compartir" como ACTION_SEND intent handler
  • Android: obtener el tamaño de archivo de la imagen antes de compartirla (Intent.ACTION_SEND)
  • ¿Cómo compartir la ubicación como whatsapp?
  • Intent.ACTION_SEND WhatsApp
  • Android Share Intent formato de archivo no compatible
  • Intent.ACTION_VIEW para la imagen de Android
  • Propuesta de participación de Android para facebook- compartir texto y enlace
  • Detectar el compartidor utilizado para compartir contenido
  • ¿Cómo puedo añadir mi aplicación de Android al diálogo compartido?
  • La devolución de llamada después de completar la intención de compartir
  • Actividad Resultado en shareIntent
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.