我建立一个报警程序。该应用程序的一部分扫描一次一个按钮被点击的装置的内部和外部存储器中,然后在系统中显示一个ListView
显示所有的音频文件。代码的相关部分如下:ListActivity到永远,应用程序提供了一个空白的屏幕
UpdateTime.java:
public class UpdateTime extends Activity {
Intent changeSound;
Button alarmSound;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.update_time);
alarmSound = (Button)findViewById(R.id.alarmSound);
alarmSound.setOnClickListener(new OnClickListener(){
@Override
public void onClick(View v) {
changeSound = new Intent (UpdateTime.this, SelectAudio.class);
startActivityForResult(changeSound, 1);
}
});
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.update_time, menu);
return true;
}
}
在此可以找到音频文件的类,然后将其显示在ListActivity
。我已经检查这个类别的地方的listData()
方法,并且它工作得很好,所以你可以跳过读的那部分,如果你想。
SelectAudio.class:
public class SelectAudio extends ListActivity {
public static final int selectAudioInteger = 2;
Intent incomingIntent;
String fileName [];
String fileTitle [];
String names = "";
String titles = "";
ContentResolver myResolver;
Cursor myCursor;
@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
myResolver = this.getContentResolver();
incomingIntent = getIntent();
listData();
fileName = names.split("\n");
fileTitle = titles.split("\n");
setListAdapter(new ArrayAdapter<String>(this, android.R.layout.simple_expandable_list_item_1, fileTitle));
}
@Override
protected void onListItemClick(ListView l, View v, int position, long id) {
// TODO Auto-generated method stub
super.onListItemClick(l, v, position, id);
String str = fileName[position];
incomingIntent.putExtra("fileTitle", str);
setResult(selectAudioInteger, incomingIntent);
Toast toast = Toast.makeText(getApplicationContext(), fileTitle[position] + " selected" , Toast.LENGTH_SHORT);
toast.show();
finish();
}
void listData()
{
Uri uriInternal = android.provider.MediaStore.Audio.Media.INTERNAL_CONTENT_URI;
Uri uriExternal = android.provider.MediaStore.Audio.Media.EXTERNAL_CONTENT_URI;
Cursor curExternal = myResolver.query(uriExternal, null, MediaStore.Audio.Media.IS_MUSIC, null, null);
Cursor curInternal = myResolver.query(uriInternal, null, MediaStore.Audio.Media.IS_MUSIC, null, null);
int iTitleExternal = curExternal.getColumnIndex(MediaStore.Audio.Media.TITLE);
int iTitleInternal = curInternal.getColumnIndex(MediaStore.Audio.Media.TITLE);
int iNameExternal = curExternal.getColumnIndex(MediaStore.Audio.Media.DATA);
int iNameInternal = curExternal.getColumnIndex(MediaStore.Audio.Media.DATA);
while(!curExternal.moveToLast())
{
names = names + curExternal.getString(iNameExternal) + "\n";
titles = titles + curExternal.getString(iTitleExternal) + "\n";
curExternal.moveToNext();
}
while (!curInternal.moveToLast())
{
names = names + curInternal.getString(iNameInternal) + "\n";
titles = titles + curInternal.getString(iTitleInternal) + "\n";
curInternal.moveToLast();
}
}
}
这段代码的问题是,一旦点击按钮时,屏幕变为空白,并在logcat中,我收到一条消息,其内容是这样的:
03-19 18:18:18.798: W/ActivityManager(59): Activity pause timeout for HistoryRecord{4a2a3d70 com.ikshvaku.intelligentalarm/.UpdateTime}
03-19 18:18:21.854: I/ActivityManager(59): Displayed activity com.ikshvaku.intelligentalarm/.SelectAudio: 3053 ms (total 3053 ms)
03-19 18:18:28.322: W/ActivityManager(59): Launch timeout has expired, giving up wake lock!
03-19 18:18:28.855: W/ActivityManager(59): Activity idle timeout for HistoryRecord{4a12ce98 com.ikshvaku.intelligentalarm/.SelectAudio}
我所知,解的问题与使用AsyncTask类有关。我只是无法找到如何解决这个问题。
任何人可以请帮助! 谢谢。
问题出在'while(!curExternal.moveToLast())'这是什么意思? – Selvin 2013-03-19 12:57:22
由于是查询,为什么不直接使用CursorAdapter呢?这里有很多例子。 – 2013-03-19 12:59:36
@RajeshCP:我不明白你的问题?基本上我在单独的项目中单独的ListActivity上检查了整个代码。它在那里工作得很好。当我在这个项目中导入了相同的代码,并进行了一些修改后,我无法得到想要的结果。 – Rajat 2013-03-19 13:01:27