2

res/raw フォルダからオーディオ ファイルを共有しようとしています。私がこれまでに行ったことは次のとおりです。

Uri uri = Uri.parse("android.resource://" + getPackageName() + "/" + R.raw.sound); //parse path to uri
Intent share = new Intent(Intent.ACTION_SEND); //share intent
share.setType("audio/*");
share.putExtra(Intent.EXTRA_STREAM, uri);
startActivity(Intent.createChooser(share, "Share sound to"));

たとえば、GMail で共有することを選択すると、「空のファイルを添付できませんでした」のようなメッセージが表示されます。正しいファイル パスを取得していないように見えるため、基本的に何も共有していません。私は何を間違っていますか?

どんな助けでも大歓迎です。

4

3 に答える 3

1

私は何を間違っていますか?

android.resource Uri値を正しく処理するアプリはほとんどありません。選択肢は次のとおりです。

  1. フィーチャーをドロップするか、または

  2. リソースからファイルにデータをコピーしてから、おそらくmyFileProvider組み合わせて使用​​します。LegacyCompatCursorWrapper

  3. リソースを直接提供できるmyStreamProviderを使用するか、raw

  4. リソースからデータをファイルにコピーしてから を使用しUri.fromFile()ますが、N Developer Preview でのテストの予備結果に基づくと、次のバージョンの Android では動作しなくなるようです。

于 2016-03-12T15:56:56.037 に答える
0

編集: NullPointException が発生していました。これは私がしていたことです:

File dest = Environment.getExternalStorageDirectory();
                InputStream in = getResources().openRawResource(R.raw.sound);

try
{
    OutputStream out = new FileOutputStream(new File(dest, "sound.mp3"));
    byte[] buf = new byte[1024];
    int len;
    while ( (len = in.read(buf, 0, buf.length)) != -1){
        out.write(buf, 0, len);
    }
    in.close();
    out.close();

}catch (Exception e) {}


 final Uri uri = FileProvider.getUriForFile(Soundboard.this, "myapp.folagor.miquel.folagor", dest); //NullPointerException right here!!

 final Intent intent = ShareCompat.IntentBuilder.from(Soundboard.this)
                        .setType("audio/*")
                        .setSubject(getString(R.string.share_subject))
                        .setStream(uri)
                        .setChooserTitle(R.string.share_title)
                        .createChooserIntent()
                        .addFlags(Intent.FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET)
                        .addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);

  startActivity(intent);

コードはちょうどよかったです。唯一の問題は、マニフェストの許可で、「android.permissions.WRITE_EXTERNAL_STORAGE」ではなく「WRITE_EXTERNAL_STORAGE」があったことです。そのため、外部ストレージに書き込む権限がなく、権限がないために FileNotFoundException が発生しました。今では正常に動作します!

于 2016-03-12T17:41:50.563 に答える