hamedjj
یک شنبه 28 اردیبهشت 1393, 03:29 صبح
سلام
من تو کلاس mainactivity دارم از downloadManager برای دانلود آهنگ ها در listview استفاده میکنم که ارور زیر را در logcat دریافت کردم:
FATAL EXCEPTION: main
android.database.CursorIndexOutOfBoundsException: Index -1 requested, with a size of 24
at android.database.AbstractCursor.checkPosition(Abst ractCursor.java:424)
at android.database.AbstractWindowedCursor.checkPosit ion(AbstractWindowedCursor.java:136)
at android.database.AbstractWindowedCursor.getString( AbstractWindowedCursor.java:50)
تو stackoverflow این سوال را مطرح کردم که جواب این بود:
Your Cursor is not positioned on a valid row. Use moveToFirst() or one of the other move...() methods to position the Cursor on the row that you wish to read from.
که میگه cursor شما در موقیت یا پوزیشن درستی نیست . از movetofirst() یا ... استفاده کن تا موقعیت cursor را در سطر ها درست کنید .(کامل ترجمه نکردم ... منظورش تقریبا همینه)
خوب الان برای این کار باید در کلاس downloadManager خودم چیکار کنم که این ارور را دوباره نگیرم:
mainActivity :
public class MainActivity extends ActionBarActivity {
public ListView listview;
private DownloadManager mgr=null;
private long lastDownload;
private String name;
private MediaPlayer mp;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mgr=(DownloadManager) getSystemService(DOWNLOAD_SERVICE);
registerReceiver(onComplete,new IntentFilter(DownloadManager.ACTION_DOWNLOAD_COMPL ETE));
registerReceiver(onNotificationClick,new IntentFilter(DownloadManager.ACTION_NOTIFICATION_C LICKED));
mp = new MediaPlayer();
MyDatabase MyDatabase = new MyDatabase(this);
SQLiteDatabase mydb = MyDatabase.getReadableDatabase();
Cursor c = mydb.rawQuery("select id from list" , null);
String[] array = new String[c.getCount()];
int i = 0;
if (c.moveToFirst()) {
do {
try {
array[i] = c.getString(c.getColumnIndex("id"));
i++;
} catch (Exception e) {
e.printStackTrace();
}
} while (c.moveToNext());
}
ListView list = (ListView) findViewById(R.id.listView1);
list.setAdapter(new MyAdapter(this, array));
list.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> arg0, View v, int position,
long id) {
Download();
}
});
}
protected void Download() {
MyDatabase MyDatabase = new MyDatabase(this);
SQLiteDatabase mydb = MyDatabase.getReadableDatabase();
Cursor c = mydb.rawQuery("select id,url from list" , null);
name = "hamed"+c.getString(c.getColumnIndex("id"))+".mp3";
Uri uri=Uri.parse(c.getString(c.getColumnIndex("url")));
lastDownload=mgr.enqueue(new DownloadManager.Request(uri)
.setAllowedNetworkTypes(DownloadManager.Request.NE TWORK_WIFI |
DownloadManager.Request.NETWORK_MOBILE)
.setAllowedOverRoaming(false)
.setTitle("DOWNLOAD")
.setDescription("Please Wait...")
.setDestinationInExternalPublicDir("/Download/",name));
Toast.makeText(this, "آغاز دانلود در نوتیفیکیشن دستگاه شما", Toast.LENGTH_SHORT).show();
}
/////////////////////////// نمایش پیغامهای وضعیت دانلود
private CharSequence statusMessage(Cursor c) {
// TODO Auto-generated method stub
String msg="???";
switch(c.getInt(c.getColumnIndex(DownloadManager.C OLUMN_STATUS))) {
case DownloadManager.STATUS_FAILED:
msg="خطا در دانلود!";
break;
case DownloadManager.STATUS_PAUSED:
msg="توقف دانلود!";
break;
case DownloadManager.STATUS_PENDING:
msg="آماده شدن برای دانلود";
break;
case DownloadManager.STATUS_RUNNING:
msg="در حال بارگیری";
break;
case DownloadManager.STATUS_SUCCESSFUL:
msg="دانلود کامل شد";
break;
default:
msg="دانلودی به چشم نمیخورد";
break;
}
return(msg);
}
///////////////////////////////وقتی دانلود کامل شد این تابع اجرا میشود
BroadcastReceiver onComplete=new BroadcastReceiver() {
public void onReceive(Context ctxt, Intent intent) {
Toast.makeText(getApplicationContext(), "دانلود کامل شد", Toast.LENGTH_SHORT).show();
}
};
////////////////////////////// وقتی نوار دانلود در نوتیفیکیشن را لمس کنیم
BroadcastReceiver onNotificationClick=new BroadcastReceiver() {
public void onReceive(Context ctxt, Intent intent) {
display();
}
private CharSequence display() {
// TODO Auto-generated method stub
Cursor c=mgr.query(new DownloadManager.Query().setFilterById(lastDownload ));
if (c==null) {
Toast.makeText(getApplicationContext(), "فایلی یافت نشد", Toast.LENGTH_SHORT).show();
}
else {
c.moveToFirst();
Toast.makeText(getApplicationContext(), statusMessage(c), Toast.LENGTH_SHORT).show();
}
return null;
}
};
protected void start(String name2) {
// TODO Auto-generated method stub
try {
mp.reset();
String mp3Uri = Environment.getExternalStorageDirectory()+ "/Download/"+name2;
mp.setDataSource(mp3Uri);
mp.prepare();
mp.start();
} catch (IllegalArgumentException e) {
e.printStackTrace();
} catch (IllegalStateException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}
در کد بالا با کلیک بر روی لیست ویو متد download() اجرا میشه که باید شروع به دانلود بکنه که crash میشه
من تو کلاس mainactivity دارم از downloadManager برای دانلود آهنگ ها در listview استفاده میکنم که ارور زیر را در logcat دریافت کردم:
FATAL EXCEPTION: main
android.database.CursorIndexOutOfBoundsException: Index -1 requested, with a size of 24
at android.database.AbstractCursor.checkPosition(Abst ractCursor.java:424)
at android.database.AbstractWindowedCursor.checkPosit ion(AbstractWindowedCursor.java:136)
at android.database.AbstractWindowedCursor.getString( AbstractWindowedCursor.java:50)
تو stackoverflow این سوال را مطرح کردم که جواب این بود:
Your Cursor is not positioned on a valid row. Use moveToFirst() or one of the other move...() methods to position the Cursor on the row that you wish to read from.
که میگه cursor شما در موقیت یا پوزیشن درستی نیست . از movetofirst() یا ... استفاده کن تا موقعیت cursor را در سطر ها درست کنید .(کامل ترجمه نکردم ... منظورش تقریبا همینه)
خوب الان برای این کار باید در کلاس downloadManager خودم چیکار کنم که این ارور را دوباره نگیرم:
mainActivity :
public class MainActivity extends ActionBarActivity {
public ListView listview;
private DownloadManager mgr=null;
private long lastDownload;
private String name;
private MediaPlayer mp;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mgr=(DownloadManager) getSystemService(DOWNLOAD_SERVICE);
registerReceiver(onComplete,new IntentFilter(DownloadManager.ACTION_DOWNLOAD_COMPL ETE));
registerReceiver(onNotificationClick,new IntentFilter(DownloadManager.ACTION_NOTIFICATION_C LICKED));
mp = new MediaPlayer();
MyDatabase MyDatabase = new MyDatabase(this);
SQLiteDatabase mydb = MyDatabase.getReadableDatabase();
Cursor c = mydb.rawQuery("select id from list" , null);
String[] array = new String[c.getCount()];
int i = 0;
if (c.moveToFirst()) {
do {
try {
array[i] = c.getString(c.getColumnIndex("id"));
i++;
} catch (Exception e) {
e.printStackTrace();
}
} while (c.moveToNext());
}
ListView list = (ListView) findViewById(R.id.listView1);
list.setAdapter(new MyAdapter(this, array));
list.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> arg0, View v, int position,
long id) {
Download();
}
});
}
protected void Download() {
MyDatabase MyDatabase = new MyDatabase(this);
SQLiteDatabase mydb = MyDatabase.getReadableDatabase();
Cursor c = mydb.rawQuery("select id,url from list" , null);
name = "hamed"+c.getString(c.getColumnIndex("id"))+".mp3";
Uri uri=Uri.parse(c.getString(c.getColumnIndex("url")));
lastDownload=mgr.enqueue(new DownloadManager.Request(uri)
.setAllowedNetworkTypes(DownloadManager.Request.NE TWORK_WIFI |
DownloadManager.Request.NETWORK_MOBILE)
.setAllowedOverRoaming(false)
.setTitle("DOWNLOAD")
.setDescription("Please Wait...")
.setDestinationInExternalPublicDir("/Download/",name));
Toast.makeText(this, "آغاز دانلود در نوتیفیکیشن دستگاه شما", Toast.LENGTH_SHORT).show();
}
/////////////////////////// نمایش پیغامهای وضعیت دانلود
private CharSequence statusMessage(Cursor c) {
// TODO Auto-generated method stub
String msg="???";
switch(c.getInt(c.getColumnIndex(DownloadManager.C OLUMN_STATUS))) {
case DownloadManager.STATUS_FAILED:
msg="خطا در دانلود!";
break;
case DownloadManager.STATUS_PAUSED:
msg="توقف دانلود!";
break;
case DownloadManager.STATUS_PENDING:
msg="آماده شدن برای دانلود";
break;
case DownloadManager.STATUS_RUNNING:
msg="در حال بارگیری";
break;
case DownloadManager.STATUS_SUCCESSFUL:
msg="دانلود کامل شد";
break;
default:
msg="دانلودی به چشم نمیخورد";
break;
}
return(msg);
}
///////////////////////////////وقتی دانلود کامل شد این تابع اجرا میشود
BroadcastReceiver onComplete=new BroadcastReceiver() {
public void onReceive(Context ctxt, Intent intent) {
Toast.makeText(getApplicationContext(), "دانلود کامل شد", Toast.LENGTH_SHORT).show();
}
};
////////////////////////////// وقتی نوار دانلود در نوتیفیکیشن را لمس کنیم
BroadcastReceiver onNotificationClick=new BroadcastReceiver() {
public void onReceive(Context ctxt, Intent intent) {
display();
}
private CharSequence display() {
// TODO Auto-generated method stub
Cursor c=mgr.query(new DownloadManager.Query().setFilterById(lastDownload ));
if (c==null) {
Toast.makeText(getApplicationContext(), "فایلی یافت نشد", Toast.LENGTH_SHORT).show();
}
else {
c.moveToFirst();
Toast.makeText(getApplicationContext(), statusMessage(c), Toast.LENGTH_SHORT).show();
}
return null;
}
};
protected void start(String name2) {
// TODO Auto-generated method stub
try {
mp.reset();
String mp3Uri = Environment.getExternalStorageDirectory()+ "/Download/"+name2;
mp.setDataSource(mp3Uri);
mp.prepare();
mp.start();
} catch (IllegalArgumentException e) {
e.printStackTrace();
} catch (IllegalStateException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}
در کد بالا با کلیک بر روی لیست ویو متد download() اجرا میشه که باید شروع به دانلود بکنه که crash میشه