Enes Şahin
bir şey anlamaya veya öğrenmeye geldiysen gidebilirsin. burada kendi kendime takılıyorum.

Android – Raw Klasörü Üzerinden Intent ile Ses Paylaşımı

android intent ile ses paylaşımı
android intent ile ses paylaşımı enes şahin

merhaba , normalde bu saatte uymam ama bu saatte uyumayı planlamıştım çünkü erken bir vakitte uyanmam gerekiyordu. ama üzerinde çalıştığım bir uygulamada birkaç (basit!!!) hata alınca ; ‘zaten uzun sürmez şunu halledeyim sonra uyurum’ dedim ve o hatada 2.günüm. sorun hatanın basitliğinde değil ülkemiz ve dünyadaki insanların basitliğinde. ‘lan nasıl oraya geldin?’ diye sormayın. çünkü saatlerdir didik didik ettim ama yok arkadaş 2 basit hatayı çözen veya nasıl yapılacağını anlatan bir allahın kulu yok. bütün android ders blogları aynı türküyü tutturmuş gidiyorlar. eminim çoğu kodu kendisi bile yazmıyordur, diğer sitelerden bulup değişkenlerin isimlerini değiştiriyorlardır. yahu kardeşim ülkede, dünyada hayatını yazılıma vermiş adamlar varken bu sorunları çözecek adam benim gibi kıçı kırık 2-3 yıllık elemanlar mı ? neyse . aklımda androidden hafiften ders verme düşüncesi vardı ama diyordum ki ‘olum senin bildiğin ne kadar ki öğretesin?’ . ama en son karar verdim ki benim 2-3 yılda öğrendiklerim ülkedeki birçoğundan fazla, ve eğer benim gibi birileri varsa yardımcı olacağım. neyse en nihayetinde çözdüm o olayları tamamen kendim kombinasyonlar oluşturarak ve mantıkla. her neyse baya uzattım yazıyı. olaya geçelim

burayı okuyan kişi zaten intent ile sayfa geçişleri, markete link verme, başka uygulamada açma vs. gibi işlemler yapılabildiğini biliyordur. bilmiyorsanız öncelikle ona bakmalısınız (kodları okuyabiliyorsanız sorun yok buradan da öğrenebilirsiniz).

öncelikle bir yol belirleyelim: projemizin raw klasöründe bulunan dosyayı nasıl intent ile paylaşacağız ?

önemli hatırlatma: Proje klasörünüz içinde bulunan dosyaların hiçbirini direk olarak telefon üzerinden paylaşamazsınız, telefona kopyalamanız gerekir.

  1. telefona kopyalama yapmak için gerekli izinler AndroidManifest.xml üzerinden verilir.
  2. proje klasöründe bulunan paylaşılmak istenilen dosya telefona kopyalanır
  3. dosyanın kopyalandığı konuma gidilir
  4. intent ile o konumdaki yolla tilliklenir(yani paylaşılır)

öncelikle bir tane buton oluşturdum ve paylaşım o butona basınca gerçekleşecek.

birinci adım : manifestte  cihaza kopyalama ve okuma için izinlerimizi verelim.

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

ikinci adım ile devam edelim : dosyamızı kopyalayalım.

 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/&lt;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&#91;] buffer = new byte&#91;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());
            }
        }
    }

üstte bulunan kod dağarcığında raw klasöründe bulunan dosyamızı kopyalamaya dair bir fonskiyon oluşturduk.

üçüncü adım : butona tıkladığımızda kopyaladığımız dosyaya giderek onu paylaşacağız

sespaylasma = (Button) findViewById(R.id.btnsespaylas);

//eğer kaydedilecek klasör oluşturulmadıysa oluşturuyoruz
                File kaydedileceklasor = new File(getExternalFilesDir(Environment.DIRECTORY_DOWNLOADS)+"/Sesler/");
                if (!kaydedileceklasor.exists()){
                    kaydedileceklasor.mkdirs();
                }

        //butona tıklayınca ses paylaşıyoruz
        sespaylasma.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {

                //fonskiyonumuzu hangi ses dosyasını göndermek istiyorsak onu belirterek çağıracağız
                dosyayikopyala(R.raw.ses1);

                //ş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.ses1)+".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/*");
                //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ş"));
            }
        });

dosya kopyalama kısmını oncreate içinde değil de ayrıca yazmamızın nedeni birden çok ses dosyası varsa her biri için kopyalama kod dağarcığı yazacağımıza , fonksiyonu çağırarak içindeki paranteze istediğimiz kadar farklı ses dosyasını eklemekti.

işlemlerimiz bu kadar. ben elimden geldiğimce kodları açıklama çalıştım ancak anlamadığınız herhangi bir kısım veya ekstra bir durum olursa çekinmeden sorabilirsiniz . gün içinde dönmeye çalışırım.

Aşağıya MainActivity.java dosyasının bırakıyorum daha alta da proje dosyalarını. kolay bir konuydu. iyi kodlamalar

package com.sahinyghs.sespaylasma;

import androidx.appcompat.app.AppCompatActivity;

import android.content.Intent;
import android.net.Uri;
import android.os.Bundle;
import android.os.Environment;
import android.util.Log;
import android.view.View;
import android.widget.Button;

import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;

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.ses1);

                //ş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.ses1)+".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/*");
                //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/&lt;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());
            }
        }
    }

}

https://github.com/sahinyghs/IntentileSesPaylasimi

Share

sahinyghs

Ben Enes Şahin, yazılımcı sayılırım. Dünyadaki tanıdığım en zeki insan kendim. Lakabım anlayacağınız üzere "3 harfli" dir. İnsanlar beni en ufak anlayabilirse dünya çok harika bir yer olacak. -Sir Enes Şahin, Bordeaux 1879.

You may also like...

12 Responses

  1. Burak dedi ki:

    Benzer bir kod kullanıyorum. Android 10 kullananlarda whatsapp ta dosya biçimi desteklemiyor hatası alıyorum.

    • sahinyghs dedi ki:

      bu kısım :
      intent.setType(“audio/*”);

      böyle mi mp3 mü ? eğer böyleyse mp3 yapmayı dener misin?

      • Burak dedi ki:

        mp3 kodun bir bölümü

        paylasimbutonu16 =findViewById(R.id.button16);
        paylasimbutonu16.setOnLongClickListener(new View.OnLongClickListener() {
        @Override
        public boolean onLongClick(View resId) {
        //Toast.makeText(MainActivity.this, “Clicked”, Toast.LENGTH_LONG).show();

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

        try
        {
        OutputStream out = new FileOutputStream(new File(dest, “ses.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) {
        e.printStackTrace();}

        Intent share = new Intent(Intent.ACTION_SEND);
        share.putExtra(Intent.EXTRA_STREAM, Uri.parse(Environment.getExternalStorageDirectory().toString() + “/ses.mp3”));
        share.setType(“audio/mp3”);
        startActivity(Intent.createChooser(share, “Shared”));

        return false;
        }
        });

        • sahinyghs dedi ki:

          paylaşman için sesi belli bir yere kaydetmen gerekiyor ve sen koda göre sanırım android/data/ klasörüne kaydetmişsin. sesin orada olup olmadığını kontrol et. eğer orada değilse ;

          if(!kaydedilecekklasor.exists()){
          kaydedileceklasor.mkdirs();
          }

          ile bu sorunu halledersin. eğer ses orada ise sorun share intentinden dir. ses orada değilse kaydetmekte bir problem vardır.

  2. Ömer dedi ki:

    Hocam teşekkürler kodları aynen yazdım ama uygulamayı emülatörde test etmek istedim herhangi bir hata vermeden başlattı ama uygulama açılmadan “uygulama durduruldu” hatası verdi. Yani emülatörde uygulama açılmıyor. ne yapabilirim

  3. Enes dedi ki:

    Öncelikle çok teşekkür ederim. Çok uzun zamandır bu konuda çalışıyorum ama en açıklayıcı sizin yaznız olmuş. Ben sizin kodların aynısı denedim ve sorunsuzca derlendi ama paylas butonuna bastığım zaman uygulamadan atıyor. Yardımcı olur musunuz çok teşekkürler.

    • sahinyghs dedi ki:

      Merhaba, log çıktısını atabilir misin? neden attığını öğrenmek amaçlı

      • Enes dedi ki:

        2021-05-09 02:13:58.063 19061-19086/com.mec.bismillah E/eglCodecCommon: GoldfishAddressSpaceHostMemoryAllocator: ioctl_ping failed for device_type=5, ret=-1
        2021-05-09 02:14:32.043 19061-19061/com.mec.bismillah E/AndroidRuntime: FATAL EXCEPTION: main
        Process: com.mec.bismillah, PID: 19061
        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)

        logcat Error

          • Enes dedi ki:

            hocam çok araştırdım ama raw daki mp3 ü fileprovider a nasıl entegre edeceğim ve bunu uri ye nasıl aktarıp ıntent share ile paylaşabileceğimi tam anlayamadım yaklaşık 1 haftadır bunun üzerine çalışıyorum yardımcı olur musnuz ? teşekkürler..

          • sahinyghs dedi ki:

            Hocam size en basitiyle şöyle anlatacağım:
            Öncelikle direk raw klasörü üzerinden paylaşamazsınız, önce sesi telefona kopyalamalı ardından paylaşımı yapmalısınız.
            İlk olarak kopyalama işlemi yapacağız
            //bir file objesi oluşturun, bu 2 satır sesin telefona kaydedileceği yeri ayarlamak için
            String mconfigdir = “/Sesler/”;
            File msdCard = a.getExternalFilesDir(Environment.DIRECTORY_DOWNLOADS);
            File kaydedileceksesyeri = new File(msd_card + mconfigdir);
            //eğer öyle bir klasör yoksa oluşturuyoruz (bu sadece ilk kaydediliş için gerekli)
            if (!kaydedileceksesyeri.exists()){
            kaydedileceksesyeri.mkdirs();
            }
            //şimdi kopyala diye bir fonksiyon oluşturacağım ve buna int girmeliyiz şöyle:
            kopyala(R.raw.sesdosyasi);
            //bu fonksiyon şu şekilde
            private void kopyala(int sesDosyasi){
            //buraları açıklamak zor ama Input ve output streamin ne olduğunu araştırırsan anlayabilirsin
            InputStream in = getResources().openRawResource(sesDosyasi);
            //dosya adını belirtiyoruz ve sonuna uzantı eklemeyi unutmuyoruz.
            String filename = getResources().getResourceEntryName(sesDosyasi)+”.mp3″;
            msd_card = getExternalFilesDir(Environment.DIRECTORY_DOWNLOADS);

            File f = new File(filename);

            if(!f.exists()){
            try {
            OutputStream out = new FileOutputStream(new File(msd_card+mconfigdir, filename));
            byte[] buffer = new byte[1024];
            int len;
            while((len = in.read(buffer, 0, buffer.length)) != -1){
            out.write(buffer, 0, len);
            }
            in.close();
            out.close();
            } catch (IOException e) {
            Log.i(“Test”, “Setup::copyResources – “+e.getMessage());
            }
            }
            }
            //bu fonskiyon sorunsuz çalıştıysa sesi telefonun storage/emulated/0/android/data//files/Downloads/Sesler/
            //şimdi paylaşıma geçiyoruz
            //az önce kaydettiğimiz yol + müziğe verdiğimiz isim ile o ses dosyasını gidiyoruz
            File kaydedilecekses = new File( msd_card + mconfigdir + getResources().getResourceEntryName(R.raw.sesdosyasi) + “.mp3″);

            Uri gidenyeruri = FileProvider.getUriForFile(getApplicationContext(),”“,kaydedilecekses);
            //intent kısmı
            Intent shareMedia = new Intent(Intent.ACTION_SEND);
            shareMedia.setType(“audio/*”);
            shareMedia.putExtra(Intent.EXTRA_STREAM, gidenyeruri);
            startActivity(Intent.createChooser(shareMedia, “Sesi Paylaş”));

            aslında her şey tamam ancak son bir şey var File Provider kısmı
            //manifest alanında application tag inin içine eklemen gerekiyor //res klasörünün altına xml adında bir klasör açıp provider_paths.xml dosyasını oluşturuyorsun
            //o dosyanın içeriği

            Eğer her şeyi doğru yaptı isen çalışması gerekir, mümkünse android 5.5 üstü cihazda deneme yap. getExternalDirectory sıkıntısı var çünkü onlarda.

Bir cevap yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir

This site uses Akismet to reduce spam. Learn how your comment data is processed.