android SoundRecorder (录音机)添加录音列表菜单项

在录音机中添加一个录音列表项,点击后用户可以看到已经存在的录音文件。

效果图如下:

修改代码参照如下:

最初的录音机是没有录音列表选项的,所以我们要加上去。

SoundRecorder\res\menu\main_menu.xml添加录音菜单选项

<menu xmlns:android="http://schemas.android.com/apk/res/android" >

<item

android:id="@+id/menu_item_filetype"

android:title="@string/format_setting"/>

<item

android:id="@+id/menu_item_storage"

android:title="@string/storage_setting"/>

<item

android:id="@+id/menu_item_keyboard"

android:title="@string/keyboard"/>

<item

android:id="@+id/menu_item_list"

android:title="@string/audio_db_playlist_name"/>

</menu>

SoundRecorder\src\com\android\soundrecorder\SoundRecorder.java 添加对菜单项的响应

public static final String SOUNDRECORDER_PLAYLIST = "My recordings";

public boolean onOptionsItemSelected(MenuItem item) {

// TODO Auto-generated method stub

switch (item.getItemId()) {

case R.id.menu_item_keyboard:

if(mRecorder.state() == Recorder.IDLE_STATE) {

InputMethodManager inputMgr =

(InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE);

inputMgr.toggleSoftInput(0, 0);

}

break;

case R.id.menu_item_filetype:

if(mRecorder.state() == Recorder.IDLE_STATE) {

openOptionDialog(SETTING_TYPE_FILE_TYPE);

}

break;

case R.id.menu_item_storage:

if(mRecorder.state() == Recorder.IDLE_STATE) {

openOptionDialog(SETTING_TYPE_STORAGE_LOCATION);

}

break;

case R.id.menu_item_list:

Intent intent = new Intent(this, RecordingList.class);

startActivity(intent);

}

return super.onOptionsItemSelected(item);

}

/SoundRecorder/src/com/android/soundrecorder/RecordingList.java添加展示列表的activity

package com.android.soundrecorder;

import android.app.ListActivity;

import android.content.ContentResolver;

import android.content.Context;

import android.content.ContentUris;

import android.content.ContentValues;

import android.content.Intent;

import android.database.Cursor;

import android.net.Uri;

import android.os.Bundle;

import android.util.Log;

import android.widget.CursorAdapter;

import android.widget.SimpleCursorAdapter;

import android.widget.TextView;

import android.widget.Toast;

import android.content.res.Resources;

import android.provider.MediaStore;

import android.view.View;

import android.widget.ListView;

import android.view.ContextMenu;

import android.view.ContextMenu.ContextMenuInfo;

import android.widget.AdapterView.AdapterContextMenuInfo;

import android.view.LayoutInflater;

import android.view.Menu;

import android.view.MenuItem;

import java.io.File;

import android.content.DialogInterface;

import android.content.DialogInterface.OnCancelListener;

import android.content.DialogInterface.OnClickListener;

import android.app.Dialog;

import android.app.AlertDialog;

import android.widget.EditText;

import android.text.InputFilter;

public class RecordingList extends ListActivity {

static final String TAG = "RecordingList";

private static final int MAX_FILE_NAME_LENGTH = 80;

private ListView mTrackList;

private static final int MENU_RENAME = 0;

private static final int MENU_DELETE = 1;

private static final int DIALOG_DELETE = 0;

private String mCurrentRecordingTitle;

private long mSelectedId;

private String mSelectedName;

private SimpleCursorAdapter mAdapter;

@Override

public void onCreate(Bundle icicle) {

super.onCreate(icicle);

init();

mTrackList = getListView();

mTrackList.setOnCreateContextMenuListener(this);

if (icicle != null) {

onRestoreInstanceState(icicle);

}

}

@Override

protected void onSaveInstanceState(Bundle out) {

super.onSaveInstanceState(out);

out.putString("mSelectedName", mSelectedName);

out.putLong("mSelectedId", mSelectedId);

}

protected void onRestoreInstanceState(Bundle in) {

mSelectedName = in.getString("mSelectedName");

mSelectedId = in.getLong("mSelectedId");

}

public void init() {

setContentView(R.layout.recording_list);

makeCursor();

updateRecordingList(mCursor);//add by xiaoya 2014/06/17 for [bugId:VK85000000165]

setTitle(R.string.audio_db_playlist_name);

mAdapter = new SimpleCursorAdapter(this,

android.R.layout.simple_list_item_1, mCursor,

new String[] { MediaStore.Video.Media.DISPLAY_NAME },

new int[] { android.R.id.text1 });

setListAdapter(mAdapter);

}

/**

* add by xiaoya 2014/06/17 for [bugId:VK85000000165]

* @param cursor

*/

private void updateRecordingList(Cursor cursor) {

if (null != cursor) {

cursor.moveToFirst();

while (cursor.moveToNext()) {

mSelectedName = cursor.getString(cursor

.getColumnIndexOrThrow(MediaStore.Audio.Media.DATA));

mSelectedId = cursor.getLong(cursor

.getColumnIndexOrThrow(MediaStore.Audio.Playlists.Members.AUDIO_ID));

try {

File f=new File(mSelectedName);

if (!f.exists()) {

delete();

}

} catch (Exception e) {

return;

}

}

}

}

@Override

protected void onListItemClick(ListView l, View v, int position, long id) {

Intent intent = new Intent(Intent.ACTION_VIEW);

mCursor.moveToPosition(position);

String type = mCursor.getString(mCursor

.getColumnIndexOrThrow(MediaStore.Video.Media.MIME_TYPE));

mSelectedName = mCursor.getString(mCursor

.getColumnIndexOrThrow(MediaStore.Audio.Media.DATA));

//add by xiaoya 2014/06/11 for [bugId:VK85000000165] begin

try {

File f=new File(mSelectedName);

if (!f.exists()) {

Toast.makeText(v.getContext(), "This file has been removed!", Toast.LENGTH_LONG).show();

return;

}

} catch (Exception e) {

return;

}

//add by xiaoya 2014/06/11 for [bugId:VK85000000165] end

intent.setDataAndType(Uri.fromFile(new File(mSelectedName)), type);

startActivity(intent);

}

@Override

public void onCreateContextMenu(ContextMenu menu, View view,

ContextMenuInfo menuInfoIn) {

menu.add(0, MENU_DELETE, 0, R.string.menu_delete);

AdapterContextMenuInfo mi = (AdapterContextMenuInfo) menuInfoIn;

mCursor.moveToPosition(mi.position);

try {

mCurrentRecordingTitle = mCursor.getString(mCursor

.getColumnIndexOrThrow(MediaStore.Audio.Media.TITLE));

mSelectedName = mCursor.getString(mCursor

.getColumnIndexOrThrow(MediaStore.Audio.Media.DATA));

int id_idx = mCursor

.getColumnIndexOrThrow(MediaStore.Audio.Playlists.Members.AUDIO_ID);

mSelectedId = mCursor.getLong(id_idx);

} catch (IllegalArgumentException ex) {

mSelectedId = mi.id;

}

menu.setHeaderTitle(mCurrentRecordingTitle);

}

@Override

public boolean onContextItemSelected(MenuItem item) {

switch (item.getItemId()) {

case MENU_DELETE: {

showDialog(DIALOG_DELETE);

return true;

}

}

return super.onContextItemSelected(item);

}

@Override

protected Dialog onCreateDialog(int id) {

switch (id) {

case DIALOG_DELETE: {

return new AlertDialog.Builder(this)

.setTitle(getString(R.string.really_delete))

.setIcon(android.R.drawable.ic_dialog_alert)

.setPositiveButton(android.R.string.ok,

new OnClickListener() {

public void onClick(DialogInterface dialog,

int which) {

delete();

}

}).setNegativeButton(android.R.string.cancel, null)

.create();

}

}

return null;

}

private void delete() {

StringBuilder where = new StringBuilder();

where.append(MediaStore.Audio.Media._ID + " IN (");

where.append(mSelectedId);

where.append(")");

getContentResolver().delete(

MediaStore.Audio.Media.EXTERNAL_CONTENT_URI, where.toString(),

null);

File f = new File(mSelectedName);

Log.e(TAG, "delete file " + mSelectedName + ",    mSelectedId:"

+ mSelectedId);

if (!f.delete()) {

Log.e(TAG, "Failed to delete file " + mSelectedName);

}

}

private void makeCursor() {

String[] cols = new String[] { MediaStore.Audio.Playlists.Members._ID,

MediaStore.Audio.Media.TITLE, MediaStore.Audio.Media.DATA,

MediaStore.Audio.Media.DISPLAY_NAME,

MediaStore.Audio.Playlists.Members.AUDIO_ID,

MediaStore.Audio.Media.MIME_TYPE, };

if (mCursor != null) {

mCursor.close();

mCursor = null;

}

ContentResolver resolver = getContentResolver();

if (resolver == null) {

Log.e(TAG, "resolver = null");

} else if (-1 == getPlaylistId()) {

Log.e(TAG, "invalid playlist id: -1");

} else {

Uri uri = MediaStore.Audio.Playlists.Members.getContentUri(

"external", Long.valueOf(getPlaylistId()));

mCursor = resolver.query(uri, cols, null, null, mSortOrder);

}

}

private int getPlaylistId() {

Resources res = getResources();

Uri uri = MediaStore.Audio.Playlists.getContentUri("external");

final String[] ids = new String[] { MediaStore.Audio.Playlists._ID };

final String where = MediaStore.Audio.Playlists.NAME + "=?";

final String[] args = new String[] {

//SoundRecorder.SOUNDRECORDER_PLAYLIST

"My recordings"

};

Cursor cursor = getContentResolver().query(uri, ids, where, args, null);

if (cursor == null) {

Log.v(TAG, "query returns null");

}

int id = -1;

if (cursor != null) {

cursor.moveToFirst();

if (!cursor.isAfterLast()) {

id = cursor.getInt(0);

}

cursor.close();

}

return id;

}

@Override

public void onDestroy() {

if (mCursor != null) {

mCursor.close();

mCursor = null;

}

super.onDestroy();

}

private Cursor mCursor;

private String mWhereClause;

private String mSortOrder;

}

最后增加列表的布局文件:/SoundRecorder/res/layout/recording_list.xml

<span style="font-size:18px;"><?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical" >

    <ListView
        android:id="@id/android:list"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:layout_weight="1"
        android:drawSelectorOnTop="true" />
</LinearLayout></span>

时间: 2024-11-02 10:38:56

android SoundRecorder (录音机)添加录音列表菜单项的相关文章

VSTO 为Office已有右键菜单添加自己的菜单项(word,Excel)

原文:VSTO 为Office已有右键菜单添加自己的菜单项(word,Excel) private void AddRightMenu()         {            Microsoft.Office.Core.CommandBar mzBar = appWord.CommandBars["Text"];    //word文档已有的右键菜单Text Microsoft.Office.Core.CommandBar mzBar = appExcel.CommandBars

centos 给鼠标右击添加 “打开终端” 菜单项

1.以root身份在终端执行如下命令 yum -y install nautilus-open-terminal 2.重启操作系统 shutdown -r now

添加鼠标右键菜单项(EditPlus为例)

下载Editplus,发现大多是绿色版,这就导致鼠标右键快捷菜单了,使用起来不方面,上网搜集了下资料,解决方法很简单: 首先进入注册表:regedit 然后如图设置新项. 其中editplus是右键菜单显示的名字. 然后编辑command项的值. 我这里是F:\Program Files\EditPlus 3\EditPlus.exe %1 你可以设置自己的路径,绝对路径必须地,最后是空格,然后“%1”. 转:http://www.cnblogs.com/hdchild/archive/2009

[Firefox附加组件]0002.添加菜单项

Add-onSDK 还不能为火狐浏览器提供一个API添加新的菜单项.但它是可扩展的设计,所以任何人都可以建立和发布模块,使用插件开发者.大牛埃里克沃尔德写的MenuItems模块,能够使我们很方便的添加菜单项. 开发步骤 1.老规矩首先创建一个新的扩展程序.创建一个目录名称为"ItemTest"(自己随便取),并运行cfx init初始化 . mkdir ItemTest cd ItemTest cfx init 2.安装 menuitems [1].从https://github.c

Delphi通过AppendMenu和DeleteMenu在系统菜单中添加删除菜单项

Delphi在系统菜单中添加删除系统菜单项 Delphi在系统菜单中添加删除系统菜单项,利用Windows提供的API函数GetSystemMenu可以得到窗口的系统菜单句柄,再通过AppendMenu和DeleteMenu就可以添加和删除菜单了. 工具/原料 Delphi7 Windows电脑 方法/步骤 打开Delphi7,创建新的工程,默认新窗体的Name属性为Form1   在Form1的Object Inspector中Events里双击OnCreate为Form1创建OnCreate

android项目 之 记事本(5)----- 添加录音

有时,需要将重要的事以语音的形式记录下来,这个在生活中很常见,今天就为记事本添加录音的功能,先看图: 其实在第一节界面设计中,可以看出记事本的功能选项,其中底部选项栏的第三个就是添加录音.   主要步骤如下:               1.   录音Activity的界面设计.               2.   在语音按钮的监听器中添加Intent,跳转到录音Activity,这里同样是用startActivityforResult(Intent intent,int requestCod

Delphi在系统菜单中添加菜单项

unit dy219; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs; type TForm1 = class(TForm) procedure FormCreate(Sender: TObject); private procedure sysmenu(var msg: twmmenuselect);message wm_syscommand;

Delphi 在系统菜单中添加菜单项

1 unit Unit001; 2 3 interface 4 5 uses 6 Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics, 7 Vcl.Controls, Vcl.Forms, Vcl.Dialogs; 8 9 type 10 TForm1 = class(TForm) 11 procedure FormCreate(Sender:TObject

001在系统菜单中添加菜单项

技术要点: 为了操作系统菜单,先要获取系统菜单指针,可以通过GetSystemMenu函数实现,然后利用菜单指针添加一个菜单项,最后在对话框OnSysCommand方法中处理菜单项的命令. GetSystemMenu方法用于获取一个系统菜单的指针,语法如下: CMenu* GetSystemMenu(BOOL bRect); bRect:FALSE时,该方法返回当前正在使用的系统菜单:TRUE时,该方法将重新设置系统菜单到默认状态,并且方法返回值不可用. 实现过程: (1)新建一个基于对话框的应