ListView ImageButton设置铃声



我想做以下链接:http://imagizer.imageshack.us/v2/800x600q90/42/gbs4.jpg

但当我按下ImageButton时,我希望声音被设置为铃声。

这是我的代码:

公共类ListViewAdapter扩展BaseAdapter{私人语境;私人列表项目;私人布局充气机;字符串路径="SD卡/媒体/铃声";public ListViewAdapter(上下文上下文,列出项目){inflater=布局来自(上下文)的充气器;this.context=上下文;this.items=项目;}public int getCount(){return items.size();}public对象getItem(int位置){return items.get(position);}public long getItemId(int位置){返回位置;}public View getView(int position、View convertView、ViewGroup父级){字符串项=项.get(位置);视图v=null;if(convertView!=null)v=convertView;其他的v=充气机。充气(R.layout.list_row,parent,false);TextView itemTV=(TextView)v.findViewById(R.id.itemText);itemTV.setText(item);ImageButton按钮=(ImageButton)v.findViewById(R.id.button);button.setOnClickListener(新建View.OnClickListener(){public void onClick(视图v){Toast.makeText(上下文,"单击了ImageButton",Toast。LENGTH_SHORT).show();文件k=新文件(路径,"我的声音");ContentValues values=新的ContentValues();values.put(MediaStore.MediaColumns.DATA,k.getAbsolutePath());values.put(MediaStore.MediaColumns.TITLE,"examplettle");values.put(MediaStore.MediaColumns.MIME_TYPE,"audio/mp3");values.put(MediaStore.Audio.Media.ARTIST,"cssounds");values.put(MediaStore.Audio.Media.IS_RINGTONE,true);values.put(MediaStore.Audio.Media.IS_NOTIFICATION,false);values.put(MediaStore.Audio.Media.IS_ALARM,false);values.put(MediaStore.Audio.Media.IS_MUSIC,false);//将其插入数据库//将其插入数据库Uri newUri=context.getContentResolver().insert(MediaStore.Audio.Media.getContentUriForPath(k.getAbsolutePath()),值);RingtoneManager.setActualDefaultRingtoneUri(上下文,RingtoneManager.TYPE_RINGTONE,newUri);});返回v;}}

这是我的MainActivity代码,没有错误:

公共类MainActivity扩展Activity{MediaPlayer mp=新的MediaPlayer();按钮停止;ListViewAdapter适配器;int s1[]={R.raw.el_tri_abuelita_soy_tu_nieto,R.raw.el_tri_ahi_te_lavas,R.raw.el_tri_bajate_del_avion,};ImageButton imageButonMsj,imageButtonPhone;int位置;@Overridepublic void onCreate(Bundle savedInstanceState){super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);ListView list30=(ListView)findViewById(R.id.list);ArrayList项=新的ArrayList();添加("Abuelita soy tu nieto");增加("Ahi te lo lavas");items.add("Bajate del avion");adapter=新的ListViewAdapter(this,items);list30.setAdapter(适配器);list30.setOnItemClickListener(新的AdapterView.OnItemClickLister(){@Overridepublic void onItemClick(AdapterView父级,View视图,int位置,长id){方法(位置);}});Log.i("ramiro","llego al final");}public void方法(int位置){if((mp.isPlaying()==true)&&(this.position==position))mp.stop();其他{this.position=位置;尝试{mp.reset()//重置媒体播放器mp.release()//释放当前音频播放的媒体播放器mp=MediaPlayer.create(this,s1[位置])//使用选定的id创建新的媒体播放器mp.setAudioStreamType(AudioManager.STREAM_MUSIC);//mp.prepare()//salta异常mp。seekTo(0)//搜索歌曲开始意味着时间=0毫秒mp.start()//启动媒体播放器}catch(异常e){Toast.makeText(getApplication(),"错误异常",Toast.LENGTH_SHORT).show();}}}

我进行了编辑,现在应用程序正在编译,但当我按下ImageButton时,应用程序发送了一条消息->不幸的是,El Tri-Sonidos已经停止。

致命异常:mainjava.lang.SecurityException:拒绝权限:写入com.android.providers.settings.SettingsProvider uricontent://settings/system从pid=690,uid=10052需要android.permission.WRITE_SETTINGS或grantUriPermission()在android.os.Parcel.readException(Parcel.java:1425)位于android.DatabaseUtils.readExceptionFromParcel(DatabaseUtils.java:188)位于android.DatabaseUtils.readExceptionFromParcel(DatabaseUtils.java:140)位于android.content.ContentProviderProxy.insert(ContentProviderNative.java:420)位于android.content.ContentResolver.insert(ContentResolver.java:864)在android.provider.Settings$NameValueTable.putString(Settings.java:665)在android.provider.Settings$System.putString(Settings.java:862)在android.media.LingtoneManager.setActualDefaultRingtoneUri(RingtoneManager.java:655)网址:com.institutovilma.eltri.ListViewAdapterImageButton$1.onClick(ListViewAdapterImage Button.java:80)在android.view.view.performClick(view.java:4084)在android.view.view$PerformClick.run(view.java:16966)在android.os.Handler.handleCallback(Handler.java:615)在android.os.Handler.dispatchMessage(Handler.java:92)在android.os.Looper.loop(Looper.java:137)在android.app.ActivityThread.main(ActivityThreads.java:4745)位于java.lang.reflect.Method.invokeNative(Native Method)位于java.lang.reflect.Method.ioke(Method.java:511)网址:com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:786)网址:com.android.internal.os.ZygoteInit.main(ZygoteNit.java:553)在dalvik.system.NativeStart.main(Native Method)

如何修复此运行时错误?

您的IDE已经为您提供了正确的提示。更改你的童车线路以匹配这些:

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

Uri newUri= context.getContentResolver().insert(MediaStore.Audio.Media.getContentUriForPath(k.getAbsolutePath()), values);

请注意,在这两种情况下都必须传递上下文。

您应该在AndroidManifest.xml 上添加权限

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

onClickListener中,this指的是按钮,并且不能在button上调用contentResolver,您需要一个上下文。你可以试试:

getApplicationContext().getContentResolver()

范围存储从API29开始,如果您不是真正需要写权限,则不能拥有写权限。有很多方法可以做到这一点。

  • 在API29级别,您需要添加标志";android:requestLegacyExternalStorage=";真";并像往常一样请求写入许可
  • 在29级以上,您需要添加权限才能读取和写入内存
  • 如果你低于API 29级,那么你应该找到一种方法来请求具有特定指令的权限写入存储,并在这里取样";https://stackoverflow.com/questions/33162152/storage-permission-error-in-marshmallow">

最新更新