用viewpager+fragment实现仿华为自定义铃声

效果图:
系统铃声设置界面

sd卡中mp3设置为自定义铃声的界面

第一张图片为系统自带铃声,第二张图片为sd卡中mp3文件。当点击sd卡中mp3文件并保存为系统铃声后,将该mp3文件添加到系统自带铃声列表中去。

//activity_main.xml的布局文件

<?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >

    <RelativeLayout
        android:layout_width="match_parent"
        android:layout_height="50dp" >

        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_centerInParent="true"
            android:text="新消息提示音"
            android:textColor="#ff000000"
            android:textSize="16sp" >
        </TextView>
        <Button
            android:id="@+id/back_btn"
            android:layout_width="wrap_content"
            android:layout_height="match_parent"
            android:layout_alignParentLeft="true"
            android:background="#00000000"
            android:onClick="btn_back"
            android:text="返回"
            android:textColor="#ff000000"
            android:textSize="13sp" />

        <Button
            android:id="@+id/sure_btn"
            android:layout_width="wrap_content"
            android:layout_height="match_parent"
            android:layout_alignParentRight="true"
            android:background="#00000000"
            android:onClick="btn_sure"
            android:text="保存"
            android:textColor="#ff000000"
            android:textSize="13sp" />
    </RelativeLayout>
    <android.support.v4.view.ViewPager
        android:id="@+id/viewpager"
        android:layout_width="match_parent"
        android:layout_height="250dp" />

</LinearLayout>

//ringtonesetfrag.xml的布局文件


    <LinearLayout 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"
    android:orientation="vertical" >

    <TextView
        android:id="@+id/tv_nosdcard"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:gravity="center"
        android:text="没有歌曲"
        android:textColor="@android:color/darker_gray"
        android:textSize="24sp"
        android:visibility="gone" />

    <ListView
        android:id="@+id/ring_lv"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:cacheColorHint="#00000000" >
    </ListView>

</LinearLayout>

//select_iamagebutton_adapter.xml的布局文件

<?xml version="1.0" encoding="utf-8"?>
    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/selectadapter"
    android:layout_width="match_parent"
    android:layout_height="50dp"
    android:background="#FFFFFFFF"
    android:descendantFocusability="blocksDescendants" >

     <TextView
        android:id="@+id/select_imagebtn_ring_tv"
        android:layout_width="wrap_content"
        android:layout_height="50dp"
        android:layout_toRightOf="@+id/select_imagebtn_btn"
        android:layout_marginLeft="5dp"
        android:layout_centerVertical="true"
        android:gravity="center_vertical"
        android:textColor="#FF000000"
        android:textSize="20sp" />
        <ImageView
        android:id="@+id/select_imagebtn_btn"
        android:layout_width="15dp"
        android:layout_height="15dp"
        android:layout_marginLeft="20dp"
        android:layout_centerVertical="true"
        android:src="@drawable/imageview_selector" />

        </RelativeLayout>

MainActivity.java的源码:

package com.selectringtest;

    import java.util.ArrayList;
    import java.util.List;
    import android.R.integer;
    import android.content.SharedPreferences;
    import android.media.Ringtone;
    import android.os.Bundle;
    import android.os.Parcelable;
    import android.support.v4.app.Fragment;
    import android.support.v4.app.FragmentActivity;
    import android.support.v4.app.FragmentManager;
    import android.support.v4.app.FragmentPagerAdapter;
    import android.support.v4.app.FragmentTransaction;
    import android.support.v4.view.ViewPager;
    import android.support.v4.view.ViewPager.OnPageChangeListener;
    import android.util.Log;
    import android.view.View;
    import android.view.ViewGroup;
    import android.widget.Button;
    import android.widget.ListView;

    public class MainActivity extends FragmentActivity {
        private RingtoneSetAdapter mAdapter;
    ListView listView;
    Button sureBtn;
    SharedPreferences sp;
    SharedPreferences.Editor spe;
    Ringtone ringtone;
    FragmentPagerAdapter fPagerAdapter;
    List<Fragment> list;
    ViewPager mViewPager;
    OnPageChangeListener pagechangeListener;
    int pageIndex = 0;
    RingtoneSetFrag rsf;
    CustomRingSetFra crsf;
    FragmentManager mFragmentManager;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        sp = getSharedPreferences("ring", MODE_PRIVATE);
        spe = sp.edit();
        rsf = new RingtoneSetFrag();
        crsf = new CustomRingSetFra();
        mViewPager = (ViewPager) findViewById(R.id.viewpager);
        list = new ArrayList<Fragment>();
        list.add(rsf);
        list.add(crsf);
        mFragmentManager = getSupportFragmentManager();
        fPagerAdapter = new FragmentPagerAdapter(mFragmentManager) {

             private int mChildCount = 0;

             @Override
             public void notifyDataSetChanged() {         
                   mChildCount = getCount();
                   super.notifyDataSetChanged();
             }
              @Override
             public int getItemPosition(Object object)   {          
                   if ( mChildCount > 0) {
                   mChildCount --;
                   return POSITION_NONE;
                   }
                   return super.getItemPosition(object);
             }

            @Override
            public int getCount() {
                return list.size();
            }

            @Override
            public Fragment getItem(int arg0) {
                return list.get(arg0);
            }
        };
        mViewPager.setAdapter(fPagerAdapter);

        pagechangeListener = new OnPageChangeListener() {

            @Override
            public void onPageSelected(int arg0) {
                Log.i("shengwang_test", "arg0 = " + arg0 + "pageIndex ="
                        + pageIndex);
                if (pageIndex != arg0 && pageIndex == 1) {
                    crsf.stopPlayingMedia();
                }
                if (pageIndex != arg0 && pageIndex == 0) {
                    rsf.stopPlayingMedia();
                }
                pageIndex = arg0;
                fPagerAdapter.notifyDataSetChanged();
            }

            @Override
            public void onPageScrolled(int arg0, float arg1, int arg2) {
            }

            @Override
            public void onPageScrollStateChanged(int arg0) {

            }
        };
        mViewPager.setOnPageChangeListener(pagechangeListener);
    }

    public void btn_back(View view) {
        finish();
    }

    public void btn_sure(View view) {
        Log.i("shengwang_test", "pageIndex = " + pageIndex);
        if (pageIndex == 0) {
            rsf.saveRing();
        } else if (pageIndex == 1) {
            crsf.saveRing();
            rsf.refreshRing();
            fPagerAdapter.notifyDataSetChanged();
        }
    }

    @Override
    protected void onStop() {
        crsf.stopPlayingMedia();
        rsf.stopPlayingMedia();
        super.onStop();
    }

}

RingtoneSetFrag.java的源码:

package com.selectringtest;

    import android.content.SharedPreferences;
    import android.database.Cursor;
    import android.media.Ringtone;
    import android.media.RingtoneManager;
    import android.os.Bundle;
    import android.support.v4.app.Fragment;
    import android.util.Log;
    import android.view.LayoutInflater;
    import android.view.View;
    import android.view.ViewGroup;
    import android.widget.AdapterView;
    import android.widget.AdapterView.OnItemClickListener;
    import android.widget.ListView;

    public class RingtoneSetFrag extends Fragment {
    ListView listView;
    int index = 0;
    SharedPreferences sp;
    SharedPreferences.Editor spe;
    Ringtone ringtone;
    RingtoneSetAdapter mAdapter;
    RingtoneManager rm;
    int selectedPosition;
    Cursor cursor;  
    String _id ;

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
            Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.ringtonesetfrag, null);
        /*初始化SharedPreferences*/
        sp = getActivity().getSharedPreferences("ringtonefrag", 1);
        spe = sp.edit();
        listView = (ListView) view.findViewById(R.id.ring_lv);
        mAdapter = new RingtoneSetAdapter(getActivity(), sp.getInt("ringtonefrag", 0));
        listView.setAdapter(mAdapter);
        listView.setChoiceMode(ListView.CHOICE_MODE_SINGLE);
        listView.setOnItemClickListener(mOnItemClickListener);

        return view;
    }
    /*listView的按钮点击事件*/
    private OnItemClickListener mOnItemClickListener = new OnItemClickListener() {

        @Override
        public void onItemClick(AdapterView<?> parent, View view, int position,
                long id) {
            if (ringtone!=null) {
                ringtone.stop();
            }

            /*清空map*/
            mAdapter.map.clear();
            // mAdapter.map.put(position, 1);
            /*将所点击的位置记录在map中*/
            mAdapter.map.put(position, true);
            /*刷新数据*/
            mAdapter.notifyDataSetChanged();
            /*判断位置不为0则播放的条目为position*/
            if (index != position) {

                try {
                    rm = new RingtoneManager(getActivity());
                    rm.setType(RingtoneManager.TYPE_RINGTONE);
                    cursor = rm.getCursor();
    //                  rm.getRingtone(position - 1).play();
    ringtone = rm.getRingtone(position);
    uri = cursor.getString(RingtoneManager.URI_COLUMN_INDEX);
                    _id = cursor.getString(0);
                    uri = uri +"/"+ _id;    
                    ringtone.play();
                } catch (Exception e) {
                    e.printStackTrace();
                }finally{
                    cursor.close();
                }
            }

                index = position;
        }

    };
    public void stopPlayingMedia(){
        if (ringtone!=null) {
            ringtone.stop();
        }
    }
    public void saveRing(){
        if (uri!=null) {
//          Settings.System.putInt(getActivity().getContentResolver(),
//                  Settings.System.SELECTED_INDEX, index);
            spe.putInt("ringtonefrag", index).commit();
            Settings.System.putString(getActivity().getContentResolver(), Settings.System.RINGTONE, uri);
        }
    }
    public void refreshRing(){
        mAdapter.notifyDataSetChanged();
    }

    }

RingtoneSetAdapter.java的源码:

    package com.selectringtest;

    import java.util.ArrayList;
    import java.util.HashMap;
    import java.util.List;
    import java.util.Map;

    import android.annotation.SuppressLint;
    import android.content.Context;
    import android.database.Cursor;
    import android.media.RingtoneManager;
    import android.util.Log;
    import android.view.LayoutInflater;
    import android.view.View;
    import android.view.ViewGroup;
    import android.widget.BaseAdapter;
    import android.widget.ImageView;
    import android.widget.ListView;
    import android.widget.TextView;

    @SuppressLint({ "NewApi", "UseSparseArrays" })
    public class RingtoneSetAdapter extends BaseAdapter {

    public List<String> ringList;
    Context mContext;
    public Cursor cursor;
    public RingtoneManager rm;
    public Map<Integer, Boolean> map = new HashMap<Integer, Boolean>();
    public ViewHolder mHodler;
    public ListView ringView;
    public int index;
    public boolean firstItemState = true;
    /**
     * 构造方法,index参数作为记录所选铃声的position传入SharedPreferences记录并调取。
     */
    public RingtoneSetAdapter(Context context, int index) {
        this.mContext = context;
        this.index = index;
        if (firstItemState) {
            firstItemState = false;
            map.put(index, true);
        }
        getRing();
    }
    public void getRing() {
        /* 新建一个arraylist来接收从系统中获取的短信铃声数据 */
        ringList = new ArrayList<String>();
        /* 获取RingtoneManager */
        rm = new RingtoneManager(mContext);
        /* 指定获取类型为短信铃声 */
        rm.setType(RingtoneManager.TYPE_RINGTONE);
        /* 创建游标 */
        cursor = rm.getCursor();
        /* 游标移动到第一位,如果有下一项,则添加到ringlist中 */
    //      if (cursor.moveToFirst()) {
    //          do { // 游标获取RingtoneManager的列inde x
    //              ringList.add(cursor
    //                      .getString(RingtoneManager.TITLE_COLUMN_INDEX));
    //          } while (cursor.moveToNext());
    //      }
            while (cursor.moveToNext()) {
                ringList.add(cursor.getString(RingtoneManager.TITLE_COLUMN_INDEX));
            }
        }
        @Override
    public int getCount() {
        return ringList.size();
    }

    @Override
    public Object getItem(int position) {
        return position;
    }

    @Override
    public long getItemId(int position) {
        return position;
    }
        @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        /* 将convertView封装在ViewHodler中,减少系统内存占用 */
        /* convertView为空则初始化 */
        if (convertView == null) {
            convertView = LayoutInflater.from(mContext).inflate(
                    R.layout.select_iamgebutton_adapter, null);
            mHodler = new ViewHolder(convertView);
            convertView.setTag(mHodler);
        } else {
            /* 不为空则直接使用已有的封装类 */
            mHodler = (ViewHolder) convertView.getTag();
        }
        /* 设定按钮背景图 */
        mHodler.iv
                .setBackgroundResource(map.get(position) == null ? R.drawable.pressed
                        : R.drawable.checked);
        mHodler.iv.setClickable(false);
        mHodler.tv.setText(ringList.get(position));
        /* 初始化时让position为0 的item(即跟随系统)被选中,如果点击别的item了,状态改为不被选中 */
    //      if (position == index && firstItemState) {
    //          firstItemState = false;
    //          mHodler.iv.setBackgroundResource(R.drawable.checked);
    //      }

        return convertView;
    }
    /* 封装类 */
    public static class ViewHolder {
        TextView tv;
        ImageView iv;

        public ViewHolder(View v) {
            /* 组件初始化 */
            this.tv = (TextView) v.findViewById(R.id.select_imagebtn_ring_tv);
            this.iv = (ImageView) v.findViewById(R.id.select_imagebtn_btn);
        }

    }

}

CustomRingSetFra.java的源码:

package com.selectringtest;

    import java.io.IOException;
    import java.util.ArrayList;
    import java.util.List;

    import android.content.ContentValues;
    import android.content.SharedPreferences;
    import android.database.Cursor;
    import android.media.MediaPlayer;
    import android.net.Uri;
    import android.os.Bundle;
    import android.provider.MediaStore;
    import android.support.v4.app.Fragment;
    import android.util.Log;
    import android.view.LayoutInflater;
    import android.view.View;
    import android.view.ViewGroup;
    import android.widget.AdapterView;
    import android.widget.AdapterView.OnItemClickListener;
    import android.widget.ListView;
    import android.widget.TextView;
    public class CustomRingSetFra extends Fragment {
    ListView listView;
    int customIndex = 0;
    SharedPreferences sp;
    SharedPreferences.Editor spe;
    CustomRingSetAdapter mAdapter;
    Cursor cursor;
    MediaPlayer player;
    List<String> paths;
    TextView tv;
    ContentValues cv;
    Uri newUri = null;
    String savePath = null;

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
            Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.ringtonesetfrag, null);
        /* 初始化SharedPreferences */
        sp = getActivity().getSharedPreferences("customringfrag", 1);
        spe = sp.edit();
        cv = new ContentValues();
        tv =(TextView) view.findViewById(R.id.tv_nosdcard);
        listView = (ListView) view.findViewById(R.id.ring_lv);
        mAdapter = new mAdapter = new CustomRingSetAdapter(getActivity(), sp.getInt("customringfrag", 0));
        listView.setChoiceMode(ListView.CHOICE_MODE_SINGLE);
        listView.setOnItemClickListener(mOnItemClickListener);
        paths = new ArrayList<String>();
        cursor = getActivity().getContentResolver().query(
                MediaStore.Audio.Media.EXTERNAL_CONTENT_URI, null, null, null,
                MediaStore.Audio.Media.DEFAULT_SORT_ORDER);

        while (cursor.moveToNext()) {
            paths.add(cursor.getString(cursor.getColumnIndexOrThrow(MediaStore.Audio.Media.DATA)));
        }
        if (paths.size()==0) {
            tv.setVisibility(View.VISIBLE);
            listView.setVisibility(View.GONE);
        }else {
            tv.setVisibility(View.GONE);
            listView.setVisibility(View.VISIBLE);
        }
        return view;
    }
    /* listView的按钮点击事件 */
    private OnItemClickListener mOnItemClickListener = new OnItemClickListener() {

        @Override
        public void onItemClick(AdapterView<?> parent, View view, int position,
                long id) {
            if (player!=null) {
                player.stop();
            }
            /* 清空map */
            mAdapter.map.clear();
            // mAdapter.map.put(position, 1);
            /* 将所点击的位置记录在map中 */
            mAdapter.map.put(position, true);
            /* 刷新数据 */
            mAdapter.notifyDataSetChanged();
            /* 判断位置不为0则播放的条目为position-1 */
            if (customIndex != position) {
                String path = paths.get(position);
                savePath = path;

                player = MediaPlayer.create(getActivity(), Uri.parse(path));
                Log.i("shengwang_test", "player = " + player.toString());
                try {
                    player.prepare();
                } catch (IllegalStateException e) {
                    Log.d("shengwang_test","IllegalStateException:"+ e.toString());
                } catch (IOException e) {
                    Log.d("shengwang_test","IOException:"+ e.toString());
                }
                player.start();
            }
            customIndex = position;
            Log.i("shengwang_test", "position = " + position + "customIndex = " + customIndex);
        }

    };

    public void stopPlayingMedia(){
        if (player!=null) {
            player.stop();
        }
    }
    public void saveRing(){
        Log.i("shengwang_test", "CustomRingsetFra customIndex = " + customIndex);
        spe.putInt("ring", customIndex).commit();

        Uri uri = null;
        try {
            uri = MediaStore.Audio.Media.getContentUriForPath(savePath);
        } catch (Exception e1) {
        Log.i("shengwang_test", "Exception:" + e1.toString());
        }
        if (uri == null) {
            return;
        }
        Cursor cursor = getActivity().getContentResolver().query(uri, null,
                MediaStore.MediaColumns.DATA + "=?", new String[] { savePath },
                null);
                if (cursor.moveToFirst() && cursor.getCount() > 0) {
                String _id = cursor.getString(0);
                cv.put(MediaStore.Audio.Media.IS_RINGTONE, true);
                cv.put(MediaStore.Audio.Media.IS_NOTIFICATION, false);
                cv.put(MediaStore.Audio.Media.IS_ALARM, false);
                cv.put(MediaStore.Audio.Media.IS_MUSIC, false);
                try {
                    getActivity().getContentResolver()
                    .update(uri, cv, MediaStore.MediaColumns.DATA + "=?",
                    new String[] { savePath });
                } catch (Exception e) {
                    Log.e("shengwang_test", "Exception : " + e.toString());
                    e.printStackTrace();
                }
                newUri = ContentUris.withAppendedId(uri, Long.valueOf(_id));
                savePath = newUri.toString();
            }
if (savePath!=null) {
    spe.putInt("customringfrag", customIndex);
            Settings.System.putString(getActivity().getContentResolver(), Settings.System.RINGTONE, savePath);
        }
        }

    }

CustomRingSetAdapter.java的源码:

package com.selectringtest;

    import java.util.ArrayList;
    import java.util.HashMap;
    import java.util.List;
    import java.util.Map;

    import com.selectringtest.RingtoneSetAdapter.ViewHolder;

    import android.content.ContentResolver;
    import android.content.Context;
    import android.database.Cursor;
    import android.media.RingtoneManager;
    import android.provider.MediaStore;
    import android.util.Log;
    import android.view.LayoutInflater;
    import android.view.View;
    import android.view.ViewGroup;
    import android.widget.BaseAdapter;
    import android.widget.ListView;

    public class CustomRingSetAdapter extends BaseAdapter {

        public List<String> ringList;
        Context mContext;
        public Cursor cursor;
        public RingtoneManager rm;
        public Map<Integer, Boolean> map = new HashMap<Integer, Boolean>();
        public ViewHolder mHodler;
        public ListView ringView;
        public int index;
        public boolean firstItemState = true;

        /**
         * 构造方法,index参数作为记录所选铃声的position传入SharedPreferences记录并调取。
         */
        public CustomRingSetAdapter(Context context, int index) {
            this.mContext = context;
            this.index = index;
            if (firstItemState) {
                firstItemState = false;
                map.put(index, true);
            }
            getRing();
        }
        private void getRing() {
        /* 新建一个arraylist来接收从sd卡中获取的mp3数据 */
        ringList = new ArrayList<String>();
        cursor = mContext.getContentResolver().query(MediaStore.Audio.Media.EXTERNAL_CONTENT_URI, null, null, null, MediaStore.Audio.Media.DEFAULT_SORT_ORDER);  
        while (cursor.moveToNext()) {
            String tilte = cursor.getString(cursor.getColumnIndexOrThrow(MediaStore.Audio.Media.TITLE));  
            ringList.add(tilte);
        }
    }
        @Override
    public int getCount() {
        return ringList.size();
    }

    @Override
    public Object getItem(int position) {
        return position;
    }

    @Override
    public long getItemId(int position) {
        return position;
    }
        @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        if (convertView == null) {
            convertView = LayoutInflater.from(mContext).inflate(
                    R.layout.select_iamgebutton_adapter, null);
            mHodler = new ViewHolder(convertView);
            convertView.setTag(mHodler);
        } else {
            /* 不为空则直接使用已有的封装类 */
            mHodler = (ViewHolder) convertView.getTag();
        }
        /* 设定按钮背景图 */
        mHodler.iv
                .setBackgroundResource(map.get(position) == null ? R.drawable.pressed
                        : R.drawable.checked);
        mHodler.iv.setClickable(false);
        mHodler.tv.setText(ringList.get(position));
        return convertView;
    }

}

最后别忘了配置权限:

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

文章参考:http://blog.youkuaiyun.com/ykcmi/article/details/9092257

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值