2016-04-22 17 views
1

インテントを使用して内部メモリに保存された画像を共有しようとしています。"空のファイルを添付できません" - 内部メモリからGmailに画像を共有する場合

  • レイアウト
  • 保存内部
  • メモリ共有内のファイルにこのビットマップのビットマップを生成し、次のようにプロセスがある

のみ空のファイルは思える(Gmailへ)の意図を使用してこのファイル実行時に生成される(したがって、Gmailに添付することはできません)。コードがどこで乱雑になり始めるのか分かりません。だから、ここでこれらの2つの方法が

以下のようonClickListenerの内側に配置されている

public void moreShareOptions(Context context) { 
    Intent shareIntent = new Intent(Intent.ACTION_SEND); 
    shareIntent.setType("image/jpg"); 
    File photoFile = new File("sharableImage.jpg"); 
    shareIntent.putExtra(Intent.EXTRA_STREAM, Uri.fromFile(photoFile)); 
    context.startActivity(Intent.createChooser(shareIntent, context.getResources().getText(R.string.opsh_share_this))); 
} 

画像を共有するためのコード

を生成するための方法およびビットマップを保存

public void generateAndSaveBitmap(View layout) { 
//Generate bitmap 
     layout.setDrawingCacheEnabled(true); 
     layout.buildDrawingCache(); 
     Bitmap imageToSave = layout.getDrawingCache(); 
     layout.destroyDrawingCache(); 

//Create a file and path 
     File directory = layout.getContext().getDir("images", Context.MODE_PRIVATE); 
     File fileName = new File(directory, "sharableImage.jpg"); 
     if (fileName.exists()) 
      fileName.delete(); 

//Compress and save bitmap under the mentioned fileName 
     FileOutputStream fos = null; 
     try { 
      fos = new FileOutputStream(fileName); 
      imageToSave.compress(Bitmap.CompressFormat.JPEG, 100, fos); 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } finally { 
      if (fos != null) { 
       try { 
        fos.flush(); 
        fos.close(); 
       } catch (IOException e) { 
        e.printStackTrace(); 
       } 
      } 
     } 
// return directory.getAbsolutePath(); 
    } 

方法は行きます

case R.id.more_share_options: Thread t = new Thread(new Runnable() { @Override public void run() { optionsShareThis.generateAndSaveBitmap(toolbarWebView); } }); t.start(); optionsShareThis.moreShareOptions(this); break; 

問題を見つけようとしています。何か不足していますか? また、コードを改善するための提案(もしあれば)を聞いてみたいと思います。

よろしく

EDIT約FileProvider言及するため

感謝。お役立ち情報getCacheDirについて教えてください。しかし、FileProviderを使用しても、私のコードは空のファイルを返し続けます。私は複数のリソースを探索してきましたが、前述のレイアウトの実際のImageを持つファイルを生成することはできません。

generateAndSaveBitmap(レイアウトの表示) - このメソッド(上記のコード)は変更されていません。

以下

はAndroidManifest.xmlを FileProvider

を関連のコードではありません - ファイル名とそのパス

を言及するために使用 -

<provider 
    android:name="android.support.v4.content.FileProvider" 
    android:authorities="com.example.android" 
    android:exported="false" 
    android:grantUriPermissions="true"> 

    <meta-data 
     android:name="android.support.FILE_PROVIDER_PATHS" 
     android:resource="@xml/file_path" /> 

</provider> 

file_path.xmlを議論するための新しいもの

<?xml version="1.0" encoding="utf-8"?> 

<paths> 
    <files-path name="sharableImage" path="images/"/> 
</paths> 

moreShareOptions() -

public void moreShareOptions(Context context) { 

// concatenate the internal cache folder with the document its path and filename 
     final File file = new File(context.getFilesDir(), "images/sharableImage.jpg"); 
// let the FileProvider generate an URI for this private file 
     final Uri uri = FileProvider.getUriForFile(context, "com.example.android", file); 
// create an intent, so the user can choose which application he/she wants to use to share this file 

     final Intent intent; 
     if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.LOLLIPOP) { 
      intent = ShareCompat.IntentBuilder.from((Activity) context) 
        .setType("image/jpg") 
        .setStream(uri) 
        .createChooserIntent() 
        .addFlags(Intent.FLAG_ACTIVITY_NEW_DOCUMENT) 
        .addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); 

      context.startActivity(intent); 
     }else { 
     intent = ShareCompat.IntentBuilder.from((Activity) context) 
       .setType("image/jpg") 
       .setStream(uri) 
       .createChooserIntent() 
       .addFlags(Intent.FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET) 
       .addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); 

      context.startActivity(intent); 
     } 
    } 

何が欠けていますか?私は時間を費やして必要な結果を得る方法を探しました。何も実りありません。したがって、他の人が私がどこに間違っているかを指摘できるという希望でこのコードを投稿しています。

答えて

0

サードパーティのアプリは内部ストレージにアクセスできません。そして、特にAndroid Nから始めると、sharing files is strongly discouraged in general

代わりに、use FileProvider to share the content。これはthe documentationにも記載されています。

+0

FileProviderについてご説明いただきありがとうございます。まだ空のファイルだけを取得しています。ビットマップの生成と保存に関するコードに何か問題がありますか?更新されたコードのEDITセクションをチェックしてください。私がうんざりしたところへのどんな種類の指示も実際に助けになるかもしれません。 – Traveller

関連する問題