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

You may also like...

6 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

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.