Listview Ringtones







MyActivity.java
import android.app.AlertDialog;
import android.content.ContentValues;
import android.content.DialogInterface;
import android.content.Intent;
import android.media.AudioManager;
import android.media.MediaPlayer;
import android.media.RingtoneManager;
import android.net.Uri;
import android.os.Environment;
import android.provider.MediaStore;
import android.support.v7.app.ActionBarActivity;
import android.support.v7.app.ActionBar;
import android.support.v4.app.Fragment;
import android.os.Bundle;
import android.util.Log;
import android.view.KeyEvent;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.os.Build;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.ListView;
import android.widget.Toast;

import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
public class MyActivity extends ActionBarActivity {
    MediaPlayer mp = new MediaPlayer();
    int position;
    int position2;

    int s1[] = {
            R.raw.hoy_hoy_hoy,
            R.raw.huevo_pascua
    };
    String[] title = new String[]{
            "Hoy hoy hoy!!",
            "Huevo de pascua gracioso"};

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

        final ListView list30 = (ListView) findViewById(R.id.list3);

        ArrayAdapter adaptador = new ArrayAdapter(this, android.R.layout.simple_list_item_1, title);

        list30.setAdapter(adaptador);

        list30.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView parent, View view, int position, long id) {
                method(position);
            }
        });
        //list.setAdapter(adapter);
        //Log.i("ramiro", "llego al final");

        list30.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() {
            @Override
            public boolean onItemLongClick(AdapterView parent, View view, int position, long id) {
                //saveas(RingtoneManager.TYPE_RINGTONE, position);
                position2 = position; //utilizo position2 porque la this.position es para onItemClick

                final CharSequence[] items = {"Establecer como Ringtone", "Establecer como SMS/Notificación", "Establecer como Alarma"};

                AlertDialog.Builder builder = new AlertDialog.Builder(MyActivity.this);
                builder.setItems(items, new DialogInterface.OnClickListener() {
                    public void onClick(DialogInterface dialog, int item) {
                        switch (item){
                            case 0:
                                saveas(RingtoneManager.TYPE_RINGTONE, position2);
                                Toast.makeText(getApplicationContext(), "Se estableció como Ringtone", Toast.LENGTH_SHORT).show();
                                break;
                            case 1:
                                saveas(RingtoneManager.TYPE_NOTIFICATION, position2);
                                Toast.makeText(getApplicationContext(), "Se estableció como SMS/Notificación", Toast.LENGTH_SHORT).show();
                                break;
                            case 2:
                                saveas(RingtoneManager.TYPE_ALARM, position2);
                                Toast.makeText(getApplicationContext(), "Se estableció como Alarma", Toast.LENGTH_SHORT).show();
                                break;
                        }

                        dialog.cancel();
                    }
                });
                AlertDialog alert = builder.create();
                alert.show();
                return false;
            }
        });
    }

    public boolean saveas(int type, int position) {
        byte[] buffer = null;
        InputStream fIn = getBaseContext().getResources().openRawResource(
                s1[position]);
        int size = 0;

        try {
            size = fIn.available();
            buffer = new byte[size];
            fIn.read(buffer);
            fIn.close();
        } catch (IOException e) {
            return false;
        }

        String path = Environment.getExternalStorageDirectory().getPath()
                + "/media/audio/ringtones/";

        String filename = title[position];
        Log.i("ramiro", "path: " + path);

        boolean exists = (new File(path)).exists();
        if (!exists) {
            new File(path).mkdirs();
        }

        FileOutputStream save;
        try {
            save = new FileOutputStream(path + filename);
            save.write(buffer);
            save.flush();
            save.close();
        } catch (FileNotFoundException e) {
            return false;
        } catch (IOException e) {
            return false;
        }

        sendBroadcast(new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE,
                Uri.parse("file://" + path + filename)));

        File k = new File(path, filename);

        ContentValues values = new ContentValues();
        values.put(MediaStore.MediaColumns.DATA, k.getAbsolutePath());
        values.put(MediaStore.MediaColumns.TITLE, filename);
        values.put(MediaStore.MediaColumns.MIME_TYPE, "audio/ogg");

        // This method allows to change Notification and Alarm tone also. Just
        // pass corresponding type as parameter
        if (RingtoneManager.TYPE_RINGTONE == type) {
            values.put(MediaStore.Audio.Media.IS_RINGTONE, true);
        } else if (RingtoneManager.TYPE_NOTIFICATION == type) {
            values.put(MediaStore.Audio.Media.IS_NOTIFICATION, true);
        } else if (RingtoneManager.TYPE_ALARM == type) {
            values.put(MediaStore.Audio.Media.IS_ALARM, true);
        }

        Uri uri = MediaStore.Audio.Media.getContentUriForPath(k
                .getAbsolutePath());
        Uri newUri = MyActivity.this.getContentResolver().insert(uri, values);
        RingtoneManager.setActualDefaultRingtoneUri(MyActivity.this, type,
                newUri);

        // Insert it into the database
        this.getContentResolver()
                .insert(MediaStore.Audio.Media.getContentUriForPath(k
                        .getAbsolutePath()), values);

        Log.i("ramiro", "llego al final de la escritura");
        return true;
    }

    public void method(int position){
        if((mp.isPlaying()==true) && (this.position == position))
            mp.stop();
        else{
            this.position = position;
            try{
                mp.reset();                               //resets the media player
                mp.release();                             //release the media player of current audio playing
                mp= MediaPlayer.create(this, s1[position]); //create a new  media player with the selected id
                mp.setAudioStreamType(AudioManager.STREAM_MUSIC);
                //mp.prepare(); //salta exception
                mp.seekTo(0);                             //seek to starting of song means time=0 ms
                mp.start();                               //start media player
            }
            catch (Exception e)
            {
                Toast.makeText(getApplication(), "error exception", Toast.LENGTH_SHORT).show();
            }
        }
    }

    @Override
    public boolean onKeyDown(int keyCode, KeyEvent event) {
        // TODO Auto-generated method stub
        if (keyCode == event.KEYCODE_BACK) {
            System.out.println("Back is called...");
            mp.stop();
            mp.release();
            mp = null;
            finish();
        }
        return super.onKeyDown(keyCode, event);
    }
}

       
 

activity_my.xml
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MyActivity">

    <ListView
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:id="@+id/list3"
        android:layout_alignParentTop="true"
        android:layout_alignParentRight="true"
        android:layout_alignParentEnd="true" />
</RelativeLayout>

AndroidManifest.xml
Los permisos de WRITE son los que necesitas
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.tatoado.appringtones" >

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

    <application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
        <activity
            android:name=".MyActivity"
            android:label="@string/app_name" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

</manifest>

11 comentarios:

  1. Está fenomeno, muchas gracias por compartir.
    Como podría poner un icono en cada opción del menu establecer tonos??

    ResponderEliminar
    Respuestas
    1. para el listView seriá http://cursoandroidstudio.blogspot.com.ar/2014/07/listview-con-imagenes.html
      y para el menu sería algo así

      Eliminar
    2. android:icon="@drawable/icono_agregar"
      android:showAsAction="always"

      Eliminar
    3. Lo que me preguntas-> http://developer.android.com/design/building-blocks/dialogs.html
      y encontré esto también http://stackoverflow.com/questions/8533394/icons-in-a-list-dialog
      Espero que te sirva

      Eliminar
    4. Ramiro muchas gracias de nuevo, lo de los enlaces era lo que estaba buscando.

      Eliminar
  2. Buenas tardes, te comento mi duda:
    El problema es que consigo hacer funcionar al aplicacion cuando pulso a un sonido lo reproduce, y si mantengo presionado me aparece el menu selecciono una opcion me dice que se ha guadado como tono de llamad pero luego lo compruebo y no es así, que puede ser lo que este haciendo mal?

    gracias

    ResponderEliminar
    Respuestas
    1. probablemente te este haciendo falta los permisos en el AndroidManifest.xml

      Eliminar
    2. He comprobado los permisos y estan bien alguna otra idea? lo estoy probando en un telefono con lollipop

      Eliminar
  3. He comprobado lo que hace realmente y es, que vuelve a poner el sonido que trae por defecto. Si yo pongo cualquier otro sonido de los que trae el teléfono al usar la aplicación en lugar de grabar el sonido huevo de Pascua lo cambia pero pone el que trae originalmente por defecto el telefono

    ResponderEliminar
  4. Hola Ramiro, no se si ya realizaste un reproductor de música mp3, ya que me interesaría mucho saber el como se puede hacer uno cargando la música en el mismo proyecto y no reproducirla con la tarjeta sd. En ese proyecto poner géneros musicales y al seleccionarlo me muestre un listado de música de ese genero.

    ResponderEliminar
  5. Una pregunta como puedo hacer con este caso o con otro reproductor de musica para hacer un ciclo infinito, es decir cuando termine la cancion, se reprodusca automaticamente la siguiente. Lo he probado con un IF pero nose como hacerlo, gracias!!

    ResponderEliminar