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

Posted

技术标签:

【中文标题】根据所选列表视图项的位置设置铃声【英文标题】:Set ringtone based on position of selected list view item 【发布时间】:2015-02-04 20:57:44 【问题描述】:

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

public void function1(int id)

    

是设置铃声和代码的地方

public void function2(int id)

    

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

例如(尝试在设置铃声时实现此目的)单击并按住“铃声”列表项>出现上下文菜单>选择“设置为铃声”上下文菜单项>出现“电话铃声”窗口(“铃声”作为可用选项之一) > 用户单击 OK 或 Cancel > 如果用户单击 OK,则返回我的应用程序并显示 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)

    

【问题讨论】:

【参考方案1】:

要设置铃声或通知声音,请使用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

详细介绍了这样做的一种方法

第三个是使用具有相关*** Question的ACTION_RINGTONE_PICKER。

【讨论】:

【参考方案2】:

抱歉,这可能是一条评论。我现在没有足够的权限发表评论。一定要让我知道这对你有什么影响......

要获取铃声选择器,

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

现在覆盖活动/片段中的 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);
            
        
    

希望这行得通....(如果有用,请点赞)...

【讨论】:

将第一部分放在您打算启动铃声选择器对话框的位置。例如:如果您想在用户单击按钮后显示铃声对话框,则将此代码添加到 button.onClick() 中。 ;)。 好的,但是铃声的 uri 呢?我的项目中有多个铃声。 然后我猜你试图显示手机上不存在的铃声。但它与你的项目有关,你试图向用户显示这些铃声,用户必须从该集合中选择铃声...对吗? 正确,铃声在我的应用程序中+我在项目中的列表代表铃声。当用户点击列表视图项目时,所需的铃声将根据需要播放。当用户点击并按住列表视图项时,上下文菜单将出现,但我还希望所选列表视图项的名称显示为我的上下文菜单的标题(相同的上下文菜单项,不同的上下文菜单标题),当用户点击“设置为铃声”我希望根据所选的列表视图项显示铃声菜单以及所选菜单项的名称显示在该菜单中。 给我发一封电子邮件“praveenkishorepraveen@gmail.com”,以便我们可以在任何其他即时媒体上立即就该问题进行沟通。我有一个可以实施的想法。以cmets之间的这种时间间隔来回答是不好的。这可能需要很多时间......你好吗@MacaronLover?

以上是关于根据所选列表视图项的位置设置铃声的主要内容,如果未能解决你的问题,请参考以下文章

如何从列表视图中从 onItemClick() 获得的列表项的联系人 Uri 中检索数据?

具有可扩展列表视图项的Android列表视图

Flex 在列表项的视图之间传递数据

如何获取 AlertDialog 中自定义列表视图的单击项的值?

Drupal 视图中自定义表记录项的编辑链接

列表视图 itemclick 事件 appcelerator