Android - Как поделиться звуковым файлом с другими приложениями

В последнее время я использовал следующий код для обмена mp3-файлами с другими приложениями, такими как Whatsapp, и все работало нормально, но теперь я всегда получаю тост "Error2", и файл не отправляется. Я прочитал много статей на эту тему, но мне ничего не помогло.

MediaPlayer MP;





 public String ordnerpfad = Environment.getExternalStorageDirectory()+   "/Sounds";                                      
 public String soundpfad = ordnerpfad + "/sound.mp3";
 public File ordnerfile = new File(ordnerpfad);
 public File soundfile = new File(soundpfad);
 public Uri urisound = Uri.parse(soundpfad);
 public byte[] byte1 = new byte [1024];
 public int zwischenspeicher = 0;
 public InputStream is1;
 public FileOutputStream fos;
 public Intent shareintent;


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



    //0

    Button button = (Button) this.findViewById(R.id.button);
    if (button != null) {
        button.setOnClickListener(new View.OnClickListener() {


            @Override
            public void onClick(View v) {


                stopPlaying();
                MP= MediaPlayer.create(MainActivity.this, R.raw.sound1);
                MP.start();

            }


        });
    }
    button.setOnLongClickListener(new View.OnLongClickListener() {
        @Override
        public boolean onLongClick(View v) {

            if( ! ordnerfile.exists()) {

                try {
                   ordnerfile.mkdir();
                } catch (Exception e){
                    e.printStackTrace();
                    Toast.makeText(getApplicationContext(), "Error1", Toast.LENGTH_SHORT).show();
            }




            }

            try {
                is1 = getResources().openRawResource(R.raw.sound1);
                fos = new FileOutputStream(soundfile);

                while ((zwischenspeicher = is1.read(byte1)) >0){


                    fos.write(byte1, 0, zwischenspeicher);
                }

                is1.close();
                fos.close();


            }catch (Exception e){
                e.printStackTrace();
                Toast.makeText(getApplicationContext(), "Error2", Toast.LENGTH_SHORT).show();

            }

            shareintent = new Intent(Intent.ACTION_SEND);
            shareintent .setType("audio/*");
            shareintent .putExtra(Intent.EXTRA_STREAM, urisound);
            startActivity(Intent.createChooser(shareintent , "Share sound..."));





            return true;
        }

    });



    //1

    Button button1 = (Button) this.findViewById(R.id.button2);
    if (button1 != null) {
        button1.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {


                stopPlaying();
                MP= MediaPlayer.create(MainActivity.this, R.raw.sound2);
                MP.start();



            }
        });
    }
    button1.setOnLongClickListener(new View.OnLongClickListener() {
        @Override
        public boolean onLongClick(View v) {

            if( ! ordnerfile.exists()) {

                try {
                    ordnerfile.mkdir();
                } catch (Exception e){
                    e.printStackTrace();
                    Toast.makeText(getApplicationContext(), "Error1", Toast.LENGTH_SHORT).show();
                }




            }

            try {
                is1 = getResources().openRawResource(R.raw.sound2);
                fos = new FileOutputStream(soundfile);

                while ((zwischenspeicher = is1.read(byte1)) >0){


                    fos.write(byte1, 0, zwischenspeicher);
                }

                is1.close();
                fos.close();


            }catch (Exception e){
                e.printStackTrace();
                Toast.makeText(getApplicationContext(), "Error2", Toast.LENGTH_SHORT).show();

            }

            shareintent= new Intent(Intent.ACTION_SEND);
            shareintent.setType("audio/*");
            shareintent.putExtra(Intent.EXTRA_STREAM, urisound);
            startActivity(Intent.createChooser(shareintent, "Share sound..."));

            return true;
        }
    });

Manifest:

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>

2 ответа

Решение

В Android 6 и 7 доступ к внешнему хранилищу считается "опасным разрешением", которое необходимо запрашивать во время выполнения.

https://developer.android.com/training/permissions/requesting.html

Вы также можете предоставить это разрешение в настройках вашей системы (приложения> ваше приложение> разрешения)

После

shareIntent.setType("audio/*");

делать

share.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);

Другие вопросы по тегам