I want to share the mp3 file on whatsapp , when I compile my codes, there is no problem, but when I press the share button in the application, it throws it from the application.
THERE İS MY MainActivity code ;
public class MainActivity extends AppCompatActivity {
Button sespaylasma;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
sespaylasma = (Button) findViewById(R.id.btnsespaylas);
//butona tıklayınca ses paylaşıyoruz
sespaylasma.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//eğer kaydedilecek klasör oluşturulmadıysa oluşturuyoruz
File kaydedileceklasor = new File(getExternalFilesDir(Environment.DIRECTORY_DOWNLOADS)+"/Sesler/");
if (!kaydedileceklasor.exists()){
kaydedileceklasor.mkdirs();
}
//fonskiyonumuzu hangi ses dosyasını göndermek istiyorsak onu belirterek çağıracağız
dosyayikopyala(R.raw.ses);
//şu anda ses1 dosyası telefonda da bulunuyor , bulunduğu yere giderek paylaşacağız.
//burada ses dosyasının bulunduğu yere gittik , ses dosyamızı ismi ile bulduk ve artık hazır
String seskonumu ="file://"+ getExternalFilesDir(Environment.DIRECTORY_DOWNLOADS) + "/Sesler/"+getResources().getResourceEntryName(R.raw.ses)+".mp3";
Intent intent = new Intent(Intent.ACTION_SEND);
//audio şeklinin her türlüsünü desteklemesi için
//bazı yerlerde bu şekilde whatsappın kabul etmediği yazar ama doğru değil, yani hata düzeltilmiş
intent.setType("audio/mp3");
//aşağıdaki kod isteğe bağlıdır yani sadece whatsapp uygulaması üzerinden paylaşıma açık
//başka bir uygulama için yapmak istiyorsanız onun paket adını yazarsınız.
intent.setPackage("com.whatsapp");
intent.putExtra(Intent.EXTRA_STREAM, Uri.parse(seskonumu));
startActivity(Intent.createChooser(intent, "Sesi Paylaş"));
}
});
}
public void dosyayikopyala(int resId){
//kopyalamak istediğimiz ses dosyasını belirttik
InputStream inputStream = getResources().openRawResource(resId);
//sesin kopyalandığı yerde de ismi aynı olsun diye ayni ismi getirttik. bunu isterseni değiştirebilirsiniz ama uzantıyı sakın unutmayın.
String dosyaAdi = getResources().getResourceEntryName(resId)+".mp3";
//burada dosyanın kopyalanacağı yolu gösterdik, yani dosya şuraya kopyalanacak /storage/emulated/0/Android/data/<paketadınız>/Sesler/
String kopyalanacakyer = getExternalFilesDir(Environment.DIRECTORY_DOWNLOADS) + "/Sesler/";
File f = new File(dosyaAdi);
//dosya yoksa işleme devam ediyoruz , varsa problem çıkabilir
if(!f.exists()){
try {
//burada dosya yolunu bulunduğu klasörün içine belirlediğimiz isimle kopyalanması komutunu verdik
OutputStream outputStream = new FileOutputStream(new File(kopyalanacakyer, dosyaAdi));
byte[] buffer = new byte[1024];
int len;
while((len = inputStream.read(buffer, 0, buffer.length)) != -1){
outputStream.write(buffer, 0, len);
}
inputStream.close();
outputStream.close();
} catch (FileNotFoundException e) {
Log.i("Test", "Dosya Bulunamadı "+e.getMessage());
} catch (IOException e) {
Log.i("Test", "Hata oluştu "+e.getMessage());
}
}
}
}
There is my Logcat Error ;
2021-05-10 00:38:14.996 20409-20434/com.mec.bismillah E/eglCodecCommon: GoldfishAddressSpaceHostMemoryAllocator: ioctl_ping failed for device_type=5, ret=-1 2021-05-10 00:38:42.175 20409-20409/com.mec.bismillah E/AndroidRuntime: FATAL EXCEPTION: main Process: com.mec.bismillah, PID: 20409 android.os.FileUriExposedException: file:///storage/emulated/0/Android/data/com.mec.bismillah/files/Download/Sesler/ses.mp3 exposed beyond app through ClipData.Item.getUri() at android.os.StrictMode.onFileUriExposed(StrictMode.java:1978) at android.net.Uri.checkFileUriExposed(Uri.java:2371) at android.content.ClipData.prepareToLeaveProcess(ClipData.java:963) at android.content.Intent.prepareToLeaveProcess(Intent.java:10216) at android.content.Intent.prepareToLeaveProcess(Intent.java:10222) at android.content.Intent.prepareToLeaveProcess(Intent.java:10201) at android.app.Instrumentation.execStartActivity(Instrumentation.java:1667) at android.app.Activity.startActivityForResult(Activity.java:4586) at androidx.fragment.app.FragmentActivity.startActivityForResult(FragmentActivity.java:676) at android.app.Activity.startActivityForResult(Activity.java:4544) at androidx.fragment.app.FragmentActivity.startActivityForResult(FragmentActivity.java:663) at android.app.Activity.startActivity(Activity.java:4905) at android.app.Activity.startActivity(Activity.java:4873) at com.mec.bismillah.MainActivity$1.onClick(MainActivity.java:77) at android.view.View.performClick(View.java:6597) at com.google.android.material.button.MaterialButton.performClick(MaterialButton.java:1119) at android.view.View.performClickInternal(View.java:6574) at android.view.View.access$3100(View.java:778) at android.view.View$PerformClick.run(View.java:25885) at android.os.Handler.handleCallback(Handler.java:873) at android.os.Handler.dispatchMessage(Handler.java:99) at android.os.Looper.loop(Looper.java:193) at android.app.ActivityThread.main(ActivityThread.java:6669) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:858)