بروز خطا
   [message]
اشتراک در سوال
رای ها
[dataList]
پرسش و پاسخ

دانلود و اجرای موزیک در ویو پیجر

مدیریت گفتگو
f-Dehghan 11 سال پیش
آخرین تغییر: 11 سال پیش

یک ویوپیجر دارم که درون هر صفحه مشخصات موزیک هست و پایین صفحه دکمه دانلود، پلی ، پاوز و سیک بار هست .بعد از کلیک روی دکمه دانلود موزیک مورد نظر از سرور دانلود میشه ولی دکمه پلی و پاوز و .... کار نمیکنن. از hashmap هم استفاده کردم .

بعد از اینکه به صفحه بعد میرم و برمیگردم تمام دکمه ها کار میکنن .برای این کار باید تمام لیسنر دکمه ها رو در downloadmanager هم کپی کنم؟

این downloadmanager

     public static void initialize() {
downloadCompleteListener = new OnDownloadCompleteListener() {

@Override
public void onDownloadComplete(String url, String localPath) {
Log.i("LOG", "Image Download Complete, Original URL: " + url + ", Save Path: " + localPath);
String newPath = localPath.replace("/temp/", "/final/");
copyFile(localPath, newPath);
new File(localPath).delete();

filename = ActivityStartup.mAudio[pos];
final Set<String> medias = ViewPagerAdapter.audioMap.keySet();
mp = MediaPlayer.create(G.context, Uri.parse(G.DIR_FINAL + "/" + filename));
if (mp != null) {
for (String media: medias) {

if (ViewPagerAdapter.audioMap.get(media).equals(filename)) {
mp = MediaPlayer.create(G.context, Uri.parse(G.DIR_FINAL + "/" + filename));
mp.start();
}
}
}
}

};
};


public static void addToDownloadList(String url, String filename2) {
String filename = ActivityStartup.filename;
ViewPagerAdapter.audioMap.put(filename2, filename);
if (urls.contains(url)) {
return;
}

if (new File(G.DIR_FINAL + "/" + filename).exists()) {
return;
}

urls.add(url);

DownloadRequest downloadRequest = new DownloadRequest()
.downloadPath("http://192.168.56.1/sharh/" + url)
.filepath(G.DIR_TEMP + "/" + filename)
.listener(downloadCompleteListener)
.download();
}

نظرات

Hajhosseini 11 سال پیش
باید یک لیستنر هم به دانلود منیجرتون ارسال کنید، چون فرگمنت ها ممکنه از 3 تا بیشتر باشه زمانی که دانلود 100% شد و میخواستید لیستنر رو کال کنید، حتما اول چک کنید که null نباشه. ولی لیستنر دکمه ها هیچ ارتباطی به این مساله نداره. دکمه های شما باید وقتی که دانلود تمام شد فعال بشن.
f-Dehghan 11 سال پیش
دانلود که تمام میشه باید یک بار صفحه به صفحه قبل یا بعد اسکرول بشه تا آدرس فایل که داخل sdcard هست رو دریافت کنه. اگر بدون اسکرول کردن پلی رو بزنم فایل رو داخل sdcard نمیبینه. چطوری بدون اسکرول لیست رو آپدیت کنم؟
f-Dehghan 11 سال پیش
با PagerAdapter صفحه ها رو نوشتم. فرگمنت نیست.
Hajhosseini 11 سال پیش
خوب شما باید از فرگمنت ها استفاده کنید! بعد اگر لیستنر رو ارسال کنی، میتونی توی همون لیستنر بگی که لیست رو آپدیت کنی. البته شما نباید از روی لیست فایل رو بخونی، باید چک کنی ببینی وجود داره یا نه، اگر نداشت دانلود بشه، اگر درحال دانلوده دیگه دانلود نشه و پیغام در حال دانلود بده.
f-Dehghan 11 سال پیش
توی پروژه مارکت ، استاد از لیست ویو استفاده کردند و توی دانلودمنیجر بعد از اینکه تصاویر کامل لود شدن دستور ست کردن هر تصویر روی آیتم مربوط به خودش رو دادند. و بدون notifyDataSetChanged لیست آپدیت شد. کاری که من میخوام انجام بدم با این فرق داره؟ من طبق اون پیش رفتم .روشم نادرسته؟
Hajhosseini 11 سال پیش
NotifyDataSetChange بسیار سبکه و process خاصی نمیگیره، استاد تغییرات رو برای درک بهتر ما توی adapter هاشون اعمال میکردن ولی این روش توی پروژه های بزرگتر و متوسط درست نیست (در پروژه های کوچک میشه استفاده کرد)، شما باید تغییرات لیست رو توی اکتیویتی انجام بدید، حتی کلیک شدن روی آیتم هارو، ولی کلیک روی دکمه ها و اشیاء توی آیتم های لیست ویو رو باید توی آداپتر بنویسید(مامنند پروژه های استاد). در صورتی که کد ها توی آداپتر باشه، نیازی به NotifyDataSetChange نیست، ولی اگر توی اکتیویتی handle کنید باید حتما Notify کنید تا تغییرات اعمال بشه.
Hajhosseini 11 سال پیش
به نظر من معماری شما باید اینجوری باشه: زمانی که روی دکمه پخش کلیک میشه، توی آداپتر کلیک نوشته بشه، اگر فایل دانلود شده بود، که پلی بشه، اگر در حال دانلود بود(ینی توی لیست دانلود ها بود) باید اطلاع بده، اگر دانلود نشده بود، به لیست دانلود ها اضافه بشه، ولی تمام این کارها رو باید توی یک کلاس دیگه انجام بدید و نباید همه رو توی آداپتر بنویسید، توی آداپتر مدیاپلیر و نام موزیک رو به کلاس هلپری که میسازید ارسال کنید، اونجا باید عملیات فهمیدن وضعیت انجام بشه، اگر دانلود شده بود باید یک هلپر پخش صدا داشته باشید و آیدی یا آدرس آهنگ رو بفرستید براش که اون همه چیزه پخش رو هندل کنه، اگر هم دانلود نشده بود باید به کلاس دانلودر ارجاء داده بشه، ینی کد هارو تمیز در جای خودشون قرار بدید و همه رو توی آداپتر و اکتیویتی ننویسید
f-Dehghan 11 سال پیش
ممنون از توجهتون .یعنی اشکال کار من از اینه که دکمه ها رو توی اکتیویتی قرار دادم ؟ باید در آداپتر باشند ؟
f-Dehghan 11 سال پیش
ممنون .تست میکنم .لطف کردید .خیلی گیج شده بودم.
Hajhosseini 11 سال پیش
وقتی از ویوپیجر استفاده میکنید که نمیتونید دکمه هاتونو توی اکتیویتی تعریف کنید! یا باید توی Layout ی که به فرگمنت متصل میکنید باشه، یا توی یک Layout که به adapter تون میدید باشه. طریقه استفاده هم بستگی به پیاده سازیتون داره. باز اگر عکس میذاشتید بهتر میتونستم راهنماییتون کنم.

پاسخ‌ها 2

f-Dehghan 11 سال پیش

طبق راهنمایی آقای حاج حسینی کد رو به این صورت تغییر دادم و کار کرد.

     public void play(View view) {
position = myPager.getCurrentItem();
if (new File(G.DIR_FINAL + "/" + mAudio[position]).exists()) {
mp = MediaPlayer.create(G.context, Uri.parse(G.DIR_FINAL + "/" + mAudio[position]));
Toast.makeText(G.context, R.string.playing, Toast.LENGTH_LONG).show();

if (mp != null && !mp.isPlaying()) {
mp.start();
finalTime = mp.getDuration();
startTime = mp.getCurrentPosition();
if (oneTimeOnly == 0) {
seekbar.setMax((int) finalTime);
oneTimeOnly = 1;

}
endTimeField.setText(String.format("%d min, %d sec",
TimeUnit.MILLISECONDS.toSeconds((long) finalTime) / 60,
TimeUnit.MILLISECONDS.toSeconds((long) finalTime) % 60)
);
startTimeField.setText(String.format("%d min, %d sec",
TimeUnit.MILLISECONDS.toSeconds((long) startTime) / 60,
TimeUnit.MILLISECONDS.toSeconds((long) startTime) % 60)
);
seekbar.setProgress((int) startTime);
myHandler.postDelayed(UpdateSongTime, 100);
pauseButton.setEnabled(true);
playButton.setEnabled(false);
}
}
else {
filename = mAudio[myPager.getCurrentItem()];
d = new AlertDialog.Builder(this)
.setTitle(R.string.download)
.setMessage(R.string.message)
.setPositiveButton(R.string.yes, new DialogInterface.OnClickListener() {

@Override
public void onClick(DialogInterface arg0, int arg1) {

Toast.makeText(G.context, R.string.downloading, Toast.LENGTH_LONG).show();
rlPrg.setVisibility(View.VISIBLE);
playButton.setEnabled(false);
seekbar.setVisibility(View.GONE);

Thread thread = new Thread(new Runnable() {

@Override
public void run() {
startDownload("http://آدرس پوشه حاوی موزیک ها " + filename, G.DIR_FINAL +
"/" + filename, prgDownloadProgress, txtPercent);
}
});
thread.start();
}

})
.setNegativeButton(R.string.no, new DialogInterface.OnClickListener() {

public void onClick(DialogInterface dialog, int which) {

}
})

.setIcon(R.drawable.download)
.show();

Resources res = G.context.getResources();
TextView messageView = (TextView) ((Dialog) d).findViewById(android.R.id.message);
messageView.setTextColor(res.getColor(R.color.white));
final int titleId = res.getIdentifier("alertTitle", "id", "android");
final View title = ((Dialog) d).findViewById(titleId);
if (title != null) {
((TextView) title).setTextColor(res.getColor(R.color.white));
}
final int titleDividerId = res.getIdentifier("titleDivider", "id", "android");
final View titleDivider = ((Dialog) d).findViewById(titleDividerId);
if (titleDivider != null) {
titleDivider.setBackgroundColor(res.getColor(R.color.white));
}

}
}

این هم دستور دانلود که از راهنمایی دوستمون ahmadvb توی این لینک بود استفاده کردم

 

     private void startDownload(final String downloadURL, final String filePath
, final ProgressBar prgDownloadProgress
, final TextView txtPercent) {
ModuleDownloader downloadRequest = new ModuleDownloader();
OnProgressDownloadListener progressListener = new OnProgressDownloadListener() {

@Override
public void onProgressDownload(final int percent, final int downloadedSize, final int fileSize) {

G.HANDLER.post(new Runnable() {

@Override
public void run() {
Drawable draw = getResources().getDrawable(R.drawable.costum_progress);
prgDownloadProgress.setProgressDrawable(draw);
prgDownloadProgress.setProgress(percent);
txtPercent.setText(percent + " % ");
}
});
}
};
OnDownloadCompleteListener completeListener = new OnDownloadCompleteListener() {

@Override
public void OnDownloadComplete(final String filepath) {
G.HANDLER.post(new Runnable() {

@Override
public void run() {
rlPrg.setVisibility(View.GONE);
pauseButton.setEnabled(false);
playButton.setEnabled(true);
seekbar.setVisibility(View.VISIBLE);
play(playButton);//اینجا بعد از اینکه دانلود تمام شد موزیک پخش میشه
}
});
}

};
downloadRequest.downloadPath(downloadURL)
.filepath(filePath)
.simulate(true)
.progressListener(progressListener)
.completeListener(completeListener);
downloadRequest.download();
}

نظرات

Hajhosseini 11 سال پیش
ممنون از اطلاع رسانی، هنوز جا برای تمیز تر شدن داره، شما باید هر کار رو، به صورت جداگانه توی یک تابع بنویسید، اینجوری که همه چیز رو زیر هم مینویسید هم خودتون، هم برنامه نویسای دیگه اگر بعدا بخوان سورس رو تغییر بدن به مشکل بر میخورن، قابل ذکر هست که پروژه های اندروید نیازمند آپدیت هستن و همیشه مجبوریم نسخه های جدید بسازیم.
ba2ever 11 سال پیش
Hajhosseini میشه ی لطفی کنید و کد تمیز شده ی این post رو بزارید
Hajhosseini 11 سال پیش
مسعود جان من این کد رو ننوشتم و تمام کلاس هاشو ندارم که تمیزش کنم، خانم دهقان اگر لطف کنن و کد کامل و یا سمپل قرار بدن خیلی بهتره.
f-Dehghan 11 سال پیش
فرمایش آقای حاج حسینی کاملا درسته .من خیلی نامرتب نوشتم. باید ببخشید. حالا تا یاد بگیرم کلی راه مونده. در مورد کد ، من یک کم پیچیده و درهم کار کردم کل کدو بذارم آبروم میره D: پایین کد رو میگذارم
f-Dehghan 11 سال پیش
با تشکر از زحمات آقای حاج حسینی این لینک نمونه کد هست.
f-Dehghan 11 سال پیش

 package com.allbaloo.app.Music;

import java.io.File;
import java.util.concurrent.TimeUnit;
import android.app.AlertDialog;
import android.app.Dialog;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.res.Resources;
import android.graphics.drawable.Drawable;
import android.media.MediaPlayer;
import android.net.Uri;
import android.os.Bundle;
import android.os.Handler;
import android.support.v4.app.FragmentActivity;
import android.support.v4.view.ViewPager;
import android.support.v4.view.ViewPager.OnPageChangeListener;
import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.View.OnTouchListener;
import android.view.animation.Animation;
import android.view.animation.AnimationUtils;
import android.widget.Button;
import android.widget.ImageButton;
import android.widget.ImageView;
import android.widget.ProgressBar;
import android.widget.RelativeLayout;
import android.widget.SeekBar;
import android.widget.TextView;
import android.widget.Toast;


public class ActivityPager extends FragmentActivity {

public TextView startTimeField, endTimeField;
private MediaPlayer mp;
private double startTime = 0;
private double finalTime = 0;
private Handler myHandler = new Handler();
private int forwardTime = 20000;
private int backwardTime = 20000;
private SeekBar seekbar;
public ImageButton playButton;
private ImageButton pauseButton;
public static int oneTimeOnly = 0;
public String content;
Button btnPrev, btnNext;
public static ViewPager myPager;
int position;
static String filename;
ImageView btndwnload;
private int previousState, currentState;
private ProgressBar prgDownloadProgress;
private TextView txtPercent;
private RelativeLayout rlPrg;
private Object d;
private int pos;


@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.firstplay);


final Animation anim1 = AnimationUtils.loadAnimation(getApplicationContext(), R.anim.enter_from_right);
final Animation anim2 = AnimationUtils.loadAnimation(getApplicationContext(), R.anim.enter_from_left);

prgDownloadProgress = (ProgressBar) findViewById(R.id.prgDownloadProgress);
txtPercent = (TextView) findViewById(R.id.txtPercent);
rlPrg = (RelativeLayout) findViewById(R.id.rlPrg);

startTimeField = (TextView) findViewById(R.id.textView1);
endTimeField = (TextView) findViewById(R.id.textView2);
seekbar = (SeekBar) findViewById(R.id.seekBar1);
playButton = (ImageButton) findViewById(R.id.imageButton1);
pauseButton = (ImageButton) findViewById(R.id.imageButton2);
btnPrev = (Button) findViewById(R.id.btnPrev);
btnNext = (Button) findViewById(R.id.btnNext);
seekbar.setClickable(false);
pauseButton.setEnabled(false);

Intent i = getIntent();
position = i.getExtras().getInt("page");
filename = mAudio[position];

if (position == 0) {
btnPrev.setVisibility(View.INVISIBLE);
}
else
btnPrev.setVisibility(View.VISIBLE);

if (new File(G.DIR_FINAL + "/" + mAudio[position]).exists()) {
mp = MediaPlayer.create(G.context, Uri.parse(G.DIR_FINAL + "/" + mAudio[position]));

}
myPager = (ViewPager) findViewById(R.id.mypager);
MyPagerAdapter adapter = new MyPagerAdapter(this, getSupportFragmentManager());

myPager.setAdapter(adapter);

myPager.setCurrentItem(position);

myPager.setOnPageChangeListener(new OnPageChangeListener() {

@Override
public void onPageSelected(int pos) {
if (pos == 0) {
btnPrev.setVisibility(View.INVISIBLE);
}
else {
btnPrev.setVisibility(View.VISIBLE);
}
if (mp != null && mp.isPlaying()) {
mp.stop();
playButton.setEnabled(true);
}
if (new File(G.DIR_FINAL + "/" + mAudio[pos]).exists()) {
mp = MediaPlayer.create(G.context, Uri.parse(G.DIR_FINAL + "/" + mAudio[pos]));
play(playButton);
}

oneTimeOnly = 0;
seekbar.setProgress(0);

}


@Override
public void onPageScrolled(int arg0, float arg1, int arg2) {}


@Override
public void onPageScrollStateChanged(int state) {}
});
}


public void play(View view) {
position = myPager.getCurrentItem();
if (new File(G.DIR_FINAL + "/" + mAudio[position]).exists()) {
mp = MediaPlayer.create(G.context, Uri.parse(G.DIR_FINAL + "/" + mAudio[position]));
Toast.makeText(G.context, R.string.playing, Toast.LENGTH_LONG).show();

if (mp != null && !mp.isPlaying()) {
mp.start();
finalTime = mp.getDuration();
startTime = mp.getCurrentPosition();
if (oneTimeOnly == 0) {
seekbar.setMax((int) finalTime);
oneTimeOnly = 1;

}
endTimeField.setText(String.format("%d min, %d sec",
TimeUnit.MILLISECONDS.toSeconds((long) finalTime) / 60,
TimeUnit.MILLISECONDS.toSeconds((long) finalTime) % 60)
);
startTimeField.setText(String.format("%d min, %d sec",
TimeUnit.MILLISECONDS.toSeconds((long) startTime) / 60,
TimeUnit.MILLISECONDS.toSeconds((long) startTime) % 60)
);
seekbar.setProgress((int) startTime);
myHandler.postDelayed(UpdateSongTime, 100);
pauseButton.setEnabled(true);
playButton.setEnabled(false);
}
}
else {
filename = mAudio[myPager.getCurrentItem()];
d = new AlertDialog.Builder(this)
.setTitle(R.string.download)
.setMessage(R.string.message)
.setPositiveButton(R.string.yes, new DialogInterface.OnClickListener() {

@Override
public void onClick(DialogInterface arg0, int arg1) {

Toast.makeText(G.context, R.string.downloading, Toast.LENGTH_LONG).show();
rlPrg.setVisibility(View.VISIBLE);
playButton.setEnabled(false);
seekbar.setVisibility(View.GONE);

Thread thread = new Thread(new Runnable() {

@Override
public void run() {
startDownload("http://آدرس پوشه حاوی موزیک ها " + filename, G.DIR_FINAL +
"/" + filename, prgDownloadProgress, txtPercent);
}
});
thread.start();
}

})
.setNegativeButton(R.string.no, new DialogInterface.OnClickListener() {

public void onClick(DialogInterface dialog, int which) {

}
})

.setIcon(R.drawable.download)
.show();

}

}
}


private void startDownload(final String downloadURL, final String filePath
, final ProgressBar prgDownloadProgress
, final TextView txtPercent) {
ModuleDownloader downloadRequest = new ModuleDownloader();
OnProgressDownloadListener progressListener = new OnProgressDownloadListener() {

@Override
public void onProgressDownload(final int percent, final int downloadedSize, final int fileSize) {

G.HANDLER.post(new Runnable() {

@Override
public void run() {
Drawable draw = getResources().getDrawable(R.drawable.costum_progress);
prgDownloadProgress.setProgressDrawable(draw);
prgDownloadProgress.setProgress(percent);
txtPercent.setText(percent + " % ");
}
});
}
};
OnDownloadCompleteListener completeListener = new OnDownloadCompleteListener() {

@Override
public void OnDownloadComplete(final String filepath) {
G.HANDLER.post(new Runnable() {

@Override
public void run() {
rlPrg.setVisibility(View.GONE);
pauseButton.setEnabled(false);
playButton.setEnabled(true);
seekbar.setVisibility(View.VISIBLE);
play(playButton);
}
});
}

};
downloadRequest.downloadPath(downloadURL)
.filepath(filePath)
.simulate(true)
.progressListener(progressListener)
.completeListener(completeListener);
downloadRequest.download();
}

private Runnable UpdateSongTime = new Runnable() {

@Override
public void run() {
if (mp != null && mp.isPlaying()) {
startTime = mp.getCurrentPosition();
startTimeField.setText(String.format("%d min, %d sec",
TimeUnit.MILLISECONDS.toSeconds((long) startTime) / 60,
TimeUnit.MILLISECONDS.toSeconds((long) startTime) % 60)
);
seekbar.setProgress((int) startTime);
myHandler.postDelayed(this, 100);
}
}
};


public void pause(View view) {

mp.pause();
pauseButton.setEnabled(false);
playButton.setEnabled(true);
}


public void forward(View view) {
int temp = (int) startTime;
if ((temp + forwardTime) <= finalTime) {
startTime = startTime + forwardTime;
if (mp != null)
mp.seekTo((int) startTime);
}
else {}

}


public void rewind(View view) {
int temp = (int) startTime;
if ((temp - backwardTime) > 0) {
startTime = startTime - backwardTime;
if (mp != null)
mp.seekTo((int) startTime);
}
else {}

}


@Override
protected void onPause() {
super.onPause();
try {
if (mp != null && mp.isPlaying()) {
mp.stop();
mp.release();
myHandler.removeCallbacksAndMessages(null);
}
}
catch (Exception e) {}
}


@Override
protected void onResume() {
super.onResume();

}


@Override
public void onBackPressed()
{
super.onBackPressed();
try {
if (mp != null && mp.isPlaying()) {
mp.stop();
mp.release();
myHandler.removeCallbacksAndMessages(null);
}
}
catch (Exception e) {}
oneTimeOnly = 0;
finish();

}

static String[] mAudio = {
"audio-0.mp3",
"audio-1.mp3",
"audio-2.mp3",
"audio-3.mp3",
"audio-4.mp3",
"audio-5.mp3",
"audio-6.mp3",
"audio-7.mp3",
"audio-8.mp3",
"audio-9.mp3",
"audio-10.mp3",
"audio-11.mp3",
"audio-12.mp3",
"audio-13.mp3",
"audio-14.mp3",
"audio-15.mp3",
"audio-16.mp3",
"audio-17.mp3"
};


private int getItem(int i) {
return myPager.getCurrentItem() + i;
}
}

نظرات

f-Dehghan 11 سال پیش
من قبل از این اکتیویتی یک ویوپیجر دارم که position رو از اون ویوپیجر میگیرم. امیدوارم به دردتون بخوره. باز هم به خاطر بی نظمی کد عذر خواهی میکنم. کم کم درست میشه....
Hajhosseini 11 سال پیش
لطف کردید، کدهای شما تمیز نوشته شده، ولی شما همه چیز رو توی یک فرگمنت اکتیویتی نوشتید، برای هر کاری باید یک کلاس بنویسید، مثلا توی کد های شما پلی کردن و تمام کارهای که به mediaplayer مربوطه باید توی کلاس MyMediaplayer باشه، یا دانلود باید توی کلاس Downloader باشه، حتی باید برای انیمیشن ها یک کلاس تعریف کنید و تمام انیمیشن های برنامه رو درون اون قرار بدید... این میشه اصولی نوشتن. مهم این نیست که ما الان چقدر تمیز مینویسیم، مهم اینه که چقدر تلاش میکنیم تا ساده، داینامیک و تمیز ترین حالت رو پیاده سازی کنیم.
ayhan 11 سال پیش
دوستان منم یه ویو پیجر دارم میخوام یه موزیک ساده تو صفحه قرار بدم هر کاری میکنم اروررر میده موزیک رو هم قسمتrawقرار دادم فرا خوانی که میکنم در قسمت کدها ارورر میده با فرگمنت نوشتم تو رو خدا یه جوابی بدین

پاسخگویی و مشاهده پاسخ های این سوال تنها برای اعضای ویژه سایت امکان پذیر است .
چنانچه تمایل دارید به همه بخش ها دسترسی داشته باشید میتوانید از این بخش لایسنس این آموزش را خریداری نمایید .