2017-10-13 1 views
0

J'ai donc un bouton Partager qui partagera une image et un corps de texte.Pourquoi mon ACTION_SEND fonctionne-t-il parfaitement sur l'API 25+, mais il gâche les API précédentes?

Sur Nougat (API 25) et Oreo (API 26), il fonctionne parfaitement. Mais quand il s'agit d'une version plus ancienne, cela ne fonctionne pas comme prévu.

Marshmallow (API 23): insère l'image très bien mais aucun corps de texte. Lollipop (API 22): Plantage lorsque vous appuyez sur le bouton Partager avec une erreur contextuelle "Malheureusement, la messagerie s'est arrêtée." LOGCAT ne montre aucune erreur lorsque cela se produit.

Voici mon bouton Partager code:

if (id == R.id.action_shareWine) { 
     Intent intentShare = new Intent(Intent.ACTION_SEND); 
     intentShare.putExtra(intentShare.EXTRA_STREAM, imageURI); 
     intentShare.setType("image/*"); 
     intentShare.putExtra(Intent.EXTRA_TEXT, "body of text goes here"); 
     if (intentShare.resolveActivity(getPackageManager()) != null) { 
      startActivity(intentShare); 
     } 
     return true; 
    } 

Voici une image pour donner une idée visuelle de ce qui se passe:

enter image description here

Quelqu'un a des idées ce qui pourrait se passer ici?


MISE À JOUR 1

Voici le journal du crash de l'émulateur Lollipop:

FATAL EXCEPTION: Mms-1 
Process: com.android.mms, PID: 7570 

java.lang.IllegalStateException: Couldn't read row 0, col 0 from CursorWindow. Make sure the Cursor is initialized correctly before accessing data from it. 

Ce que je ne sais pas pourquoi cela se produit parce que le curseur est chargement de l'image juste bien dans un ImageView dans cette même activité.

+0

Quelle est la valeur de 'imageURI'? De plus, puisque c'est votre image et que vous connaissez le type MIME, pourquoi utilisez-vous un caractère générique? – CommonsWare

+0

'imageURI = Uri.parse (cursor.getString (cursor.getColumnIndexOrThrow (WineContract.WineEntry.COLUMN_WINE_IMAGE)))' Je sais que le curseur possède l'URI correcte car ce même code est capable de définir une image dans l'activité. – andrdoiddev

+0

Comme le commentaire précédent a dit, je suis assez sûr que "image/*" n'est pas supporté par tous les fabricants et les appareils. Vous devez spécifier le type de mine exact "image/jpeg" ou "image/png" – AlonsoFloo

Répondre

0

Appel addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION) sur le ACTION_SENDIntent, pour permettre à des tiers la possibilité de lire le contenu identifié par le Uri.

De plus, comme l'image semble être un fichier JPEG (basé sur l'extension de fichier), le type MIME est image/jpeg, et non image/* ou image/png.

+0

Oups. Je ne sais pas pourquoi je pensais que c'était png. Cela a été changé en jpeg. Mais même avec ce drapeau d'autorisation, j'ai les mêmes problèmes sur Lollipop et Marshmallow. – andrdoiddev

+0

@andrdoiddev: Eh bien, en termes de partie sans texte, veuillez comprendre qu'il n'y a aucune exigence pour une implémentation 'ACTION_SEND' de supporter à la fois' EXTRA_TEXT' et 'EXTRA_STREAM' sur le même' Intent'. Certains le feront, d'autres non, car cela va au-delà de ce que demande la documentation 'ACTION_SEND'. En termes de Lollipop, assurez-vous que vous vérifiez LogCat pour l'ensemble de l'appareil, pas seulement pour votre application, car l'accident ne provient pas de votre application. – CommonsWare

+0

Je viens de trouver le journal des pannes pour l'erreur Lollipop. Je l'ai ajouté au bas du message original. Il indique qu'il ne peut pas lire à partir du curseur, même si le curseur place correctement une image de l'URI dans un ImageView dans cette même activité. – andrdoiddev

0

Pour plus de détails

travaillant dans Oreo et Marshmallow Version Lisez ce

https://developer.android.com/reference/android/support/v4/content/FileProvider.html

Source Code

https://drive.google.com/open?id=1vfO43dMSt096CMp6nrOJNl3fJAf6MPwG

create xml folder inside providers_path.xml 

<?xml version="1.0" encoding="utf-8"?> 
<paths xmlns:android="http://schemas.android.com/apk/res/android"> 
    <external-path name="external_files" path="."/> 
</paths> 



<?xml version="1.0" encoding="utf-8"?> 
<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
    package="com.holostik.sharescreenshotexample"> 

    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> 
    <uses-permission android:name="android.permission.INTERNET" /> 
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> 
    <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" /> 
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /> 
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> 
    <uses-permission android:name="android.permission.FLASHLIGHT" /> 
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> 

    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /> 
    <uses-feature android:name="android.hardware.camera" /> 
    <uses-permission android:name="android.permission.CAMERA"></uses-permission> 


    <application 
     android:allowBackup="true" 
     android:icon="@mipmap/ic_launcher" 
     android:label="@string/app_name" 
     android:roundIcon="@mipmap/ic_launcher_round" 
     android:supportsRtl="true" 
     android:theme="@style/AppTheme"> 
     <activity android:name=".MainActivity"> 
      <intent-filter> 
       <action android:name="android.intent.action.MAIN" /> 

       <category android:name="android.intent.category.LAUNCHER" /> 
      </intent-filter> 
     </activity> 


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


    </application> 

</manifest> 

package com.holostik.sharescreenshotexample; 

import android.Manifest; 
import android.content.Intent; 
import android.content.pm.PackageManager; 
import android.graphics.Bitmap; 
import android.net.Uri; 
import android.os.Build; 
import android.os.Bundle; 
import android.os.Environment; 
import android.support.v4.app.ActivityCompat; 
import android.support.v4.content.ContextCompat; 
import android.support.v4.content.FileProvider; 
import android.support.v7.app.AppCompatActivity; 
import android.util.Log; 
import android.view.View; 
import android.widget.ImageView; 
import android.widget.LinearLayout; 
import android.widget.Toast; 

import com.holostik.sharescreenshotexample.share.ScreenshotType; 
import com.holostik.sharescreenshotexample.share.ScreenshotUtils; 

import java.io.File; 
import java.io.FileOutputStream; 
import java.util.Random; 

public class MainActivity extends AppCompatActivity { 
    int n; 
    String photoPath; 

    LinearLayout rootContent; 
    ImageView iv_share; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

     rootContent = (LinearLayout) findViewById(R.id.rootContent); 
     iv_share = (ImageView) findViewById(R.id.iv_share); 

     iv_share.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 

       if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { 
        int permissionCheck = ContextCompat.checkSelfPermission(MainActivity.this, 
          Manifest.permission.CAMERA); 

        if (permissionCheck == PackageManager.PERMISSION_GRANTED) { 
         Log.e("MainActivity ", "P granted"); 

         takeScreenshot(ScreenshotType.FULL); 

        } else { 
         ActivityCompat.requestPermissions(MainActivity.this, 
           new String[]{Manifest.permission.CAMERA, 
             Manifest.permission.READ_EXTERNAL_STORAGE, 
             Manifest.permission.WRITE_EXTERNAL_STORAGE 
           }, 1); 
        } 
       } else { 
        Log.e("MainActivity", "Lower Than MarshMallow"); 
        takeScreenshot(ScreenshotType.FULL); 
       } 

      } 
     }); 

    } 


    /* Method which will take screenshot on Basis of Screenshot Type ENUM */ 
    private void takeScreenshot(ScreenshotType screenshotType) { 
     Bitmap b = null; 
     switch (screenshotType) { 
      case FULL: 
       b = ScreenshotUtils.getScreenShot(rootContent); 
       break; 
      case CUSTOM: 
       //If Screenshot type is CUSTOM 
       break; 
     } 

     //If bitmap is not null 
     if (b != null) { 
//   showScreenShotImage(b);//show bitmap over imageview 
      Log.e("keshav", "bitmap is -- > " + b); 

      SaveImage(b); 

      shareScreenshot(); 
     /*  File saveFile = ScreenshotUtils.getMainDirectoryName(MainActivity.this);//get the path to save screenshot 
      File file = ScreenshotUtils.store(b, "screenshot" + screenshotType + ".jpg", saveFile);//save the screenshot to selected path 
      shareScreenshot(file);//finally share screenshot 
      Log.e("file Path", String.valueOf(file)); 
*/ 

     } else 
      //If bitmap is null show toast message 
      Toast.makeText(MainActivity.this, R.string.screenshot_take_failed, Toast.LENGTH_SHORT).show(); 

    } 

    private void SaveImage(Bitmap finalBitmap) 
    { 
     String root = Environment.getExternalStorageDirectory().toString(); 
     File myDir = new File(root + "/saved_images"); 
     myDir.mkdirs(); 
     Random generator = new Random(); 
     n = 10000; 
     n = generator.nextInt(n); 
     String fname = "Image-" + n + ".jpg"; 
     File file = new File(myDir, fname); 
     if (file.exists()) file.delete(); 
     try { 
      FileOutputStream out = new FileOutputStream(file); 
      finalBitmap.compress(Bitmap.CompressFormat.JPEG, 90, out); 
      out.flush(); 
      out.close(); 

     } catch (Exception e) { 
      e.printStackTrace(); 
     } 
    } 


    /* TODO Show screenshot Bitmap */ 
// private void showScreenShotImage(Bitmap b) { 
//  imageView.setImageBitmap(b); 
// } 

    private void shareScreenshot() 
    { 
     photoPath = Environment.getExternalStorageDirectory() + "/saved_images" + "/Image-" + n + ".jpg"; 
     File F = new File(photoPath); 
     //Uri U = Uri.fromFile(F); 
     // Uri U = FileProvider.getUriForFile(getActivity(), getActivity().getApplicationContext().getPackageName() + ".my.package.name.provider", F); 

     // TODO your package name as well add .fileprovider 
     Uri U = FileProvider.getUriForFile(MainActivity.this.getApplicationContext(), "com.holostik.sharescreenshotexample.fileprovider", F); 
     Intent i = new Intent(Intent.ACTION_SEND); 
     i.setType("image/png"); 
     i.putExtra(Intent.EXTRA_STREAM, U); 
     startActivityForResult(Intent.createChooser(i, "Email:"), 1); 
    } 

    // TODO Share Screen SHOT End .............. 
}