根据所选列表视图项的位置设置铃声

时间:2015-02-04 20:57:44

标签: java android android-studio

我正在尝试根据所选列表视图项的位置将所选声音保存为铃声/通知声音,但我遇到了严重的问题,为此找到相关教程(如果有的话)。下面是我的代码到目前为止,但我希望以最简单的方式实现这一点/尽可能少的代码行,因此为了简单起见,我使用了1个上下文菜单。理想情况下

public void function1(int id){

    }

是用于设置铃声和

的代码
public void function2(int id){

    }

是用于设置通知声音的代码。

E.g。 (尝试在设置铃声时实现此目的)点击&按住“chimes”列表项>出现上下文菜单>选择“设为铃声”上下文菜单项>出现“手机铃声”窗口(“chimes”作为可用选项之一)>用户单击“确定”或“取消”>如果用户单击“确定”,则返回到我的应用程序并显示Toast通知(“已保存铃声”)或者如果用户单击“取消”,则返回到我的应用程序并显示Toast通知(“未保存铃声”)。

所有帮助将受到高度赞赏。

import android.media.MediaPlayer;
import android.os.Bundle;
import android.support.v7.app.ActionBarActivity;
import android.view.ContextMenu;
import android.view.MenuItem;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.ListView;


public class MainActivity extends ActionBarActivity {

    private ListView mainList;
    private MediaPlayer mp;
    private final String[] listContent = {
            "chimes", "chord", "ding", "notify", 
            "recycle", "ringin", "ring out","tada"
    };

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        mp = new MediaPlayer();
        mainList = (ListView) findViewById(R.id.main_listView);
        ArrayAdapter<String> adapter = new ArrayAdapter<String>(this,
                android.R.layout.simple_list_item_1, listContent);
        mainList.setAdapter(adapter);
        registerForContextMenu(this.mainList);
    }


    @Override
    public void onCreateContextMenu(ContextMenu menu, View v,ContextMenu.ContextMenuInfo menuInfo) {
        super.onCreateContextMenu(menu, v, menuInfo);
        menu.add(0, v.getId(), 0, "Action 1");
        menu.add(0, v.getId(), 0, "Action 2");
    }

    @Override
    public boolean onContextItemSelected(MenuItem item) {
        if (item.getTitle().equals("Action 1")){
            function1(item.getItemId());
        } else if (item.getTitle().equals("Action 2")){
            function2(item.getItemId());
        } else {
            return false;
        }
        return true;
    }

    public void function1(int id){

    }
    public void function2(int id){

    }
}

2 个答案:

答案 0 :(得分:4)

要设置铃声或通知声音,请使用RingToneManager

特别是你使用

RingtoneManager.setActualDefaultRingtoneUri(getApplicationContext(), RingtoneManager.TYPE_RINGTONE, newUri);

用于设置默认铃声。你用

RingtoneManager.setActualDefaultRingtoneUri(getApplicationContext(), RingtoneManager.TYPE_NOTIFICATION, newUri);

用于设置默认通知声音。

这需要一个URI(统一资源标识符),它不是整数或ItemId,就像你的函数当前所使用的那样。

从您的示例代码中,可以选择一些可能的选项。

第一种是将铃声的标题传入函数,作为字符串而不是ID,然后调用RingtoneManager.getCursor()以获取所有可能铃声的列表并检查每个铃声以查看如果标题匹配,如果匹配,则设置匹配标题的URI。

第二种是根据所有可用铃声的光标和id中的传递来制作选择列表,并使用RingtoneManager.getRingtoneUri(id)获取URI。执行此操作的一种方法详见Using SimpleCursorAdapter to Display Ringtones from RingtoneManager in Android Using ListView Templates

第三种是使用具有相关StackOverflow Question的ACTION_RINGTONE_PICKER。

答案 1 :(得分:0)

对不起,这可能是一个评论。我现在没有足够的权限发表评论。并且让我知道这对你来说是如何工作的......

要获取铃声选择器,

Intent intent = new Intent(RingtoneManager.ACTION_RINGTONE_PICKER);
intent.putExtra(RingtoneManager.EXTRA_RINGTONE_SHOW_SILENT, false);
intent.putExtra(RingtoneManager.EXTRA_RINGTONE_SHOW_DEFAULT, true);
intent.putExtra(RingtoneManager.EXTRA_RINGTONE_TYPE,RingtoneManager.TYPE_NOTIFICATION);
startActivityForResult(intent,999);

现在覆盖activity / fragment中的onActivityResult()。

@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    if (resultCode == Activity.RESULT_OK
            && requestCode == 999)
        if (data.getParcelableExtra(RingtoneManager.EXTRA_RINGTONE_PICKED_URI) != null) {
            Uri uri = data.getParcelableExtra(RingtoneManager.EXTRA_RINGTONE_PICKED_URI);
            if (uri != null) {
                RingtoneManager.setActualDefaultRingtoneUri(getApplicationContext(), RingtoneManager.TYPE_NOTIFICATION, uri);
            }
        }
    }
}

希望这有效......(如果有用的话还有Upvote ......)