PDA

View Full Version : مشکل در پخش موزیک از ادرس https



samiasoft
سه شنبه 22 بهمن 1398, 18:28 عصر
سلام دوستان وقت بخیر

برای پخش یک موزیک دستور زیر رو نوشتم :

mediaPlayer = new MediaPlayer();

String url ="https://sv.singsong.live/98/11/22/Amirali%20Khani%20-%20Naro%20-%20128%20-%20SingSong.mp3";




mediaPlayer.setDataSource(this, Uri.parse(url));
mediaPlayer.setAudioStreamType(AudioManager.STREAM _MUSIC);




mediaPlayer.prepareAsync();


mediaPlayer.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
@Override
public void onPrepared(MediaPlayer mp) {


mp.start();
}
});

وقتی ادرس موزیک با http باشه به راحتی موزیک پخش میشه اما متاسفانه وقتی لینک بصورت ssl باشه ینی با https شروع بشه با خطای زیر مواجه میشوم :

MediaPlayer: Couldn't open file on client side; trying server side
MediaPlayer: error (1, -1004)

ناگفته نماند که این خطا رو فقط در اندروید های پایینتر از جمله 4.2 و 4.3 و 4.4 مواجه میشوم (یا به عبارتی API-17 و API-18 و API-19) و در نسخه های بالاتر هیچ مشکلی نداره.

فکر میکنم بایستی در این نسخه از اندروید ها ssl فعال کنیم...اما اینکه چطوری اینکارو برای موزیک پلیر انجام بدم راهی پیدانکردم.

mehdi.safavie
سه شنبه 22 بهمن 1398, 23:46 عصر
درود;


خودم شخصا به این مشکل نخوردم. اما یک بار یکی این مشکل رو داشت ، نتونستم پیدا کنم کجا جوابش رو دادم مشکلش حل شد. هر چی یادم بود رو سرچ زدم، اینجا مینویسم ، امیدوارم کمکت کنه.
تا جایی که یادمه باید داخل DefaultHttpDataSource مقدار allowCrossProtocolRedirects رو true کنی.
شما از setDataSource استفاده کردی، برای این که بتونی allowCrossProtocolRedirects رو true کنی باید از ExtractorMediaSource استفاده کنی.این کدی که از اینترنت گرفتم رو بخون ، کمی کمکت میکنه بتونی allowCrossProtocolRedirects رو true کنی و مشکلت رو حل کنی.


renderersFactory =newDefaultRenderersFactory(getActivity()); bandwidthMeter = new DefaultBandwidthMeter();
trackSelectionFactory = new AdaptiveTrackSelection.Factory(bandwidthMeter);
trackSelector = new DefaultTrackSelector(trackSelectionFactory);
loadControl = new DefaultLoadControl();
player = ExoPlayerFactory.newSimpleInstance(renderersFactor y, trackSelector, loadControl);
dataSourceFactory = new DefaultDataSourceFactory(getActivity(), "ExoplayerDemo");
extractorsFactory = new DefaultExtractorsFactory();`




ringtoneAdapter = new RingtoneAdapter1(ringtoneList, getActivity(), player, mediaSource, trackSelectionFactory, dataSourceFactory, extractorsFactory, mainHandler, renderersFactory, bandwidthMeter, loadControl, trackSelector, playeditem, Boolean.valueOf(false));




mediaSource = new ExtractorMediaSource
.Factory(dataSourceFactory)
.setExtractorsFactory(extractorsFactory)
.createMediaSource(Uri.parse(ringtoneList.get(posi tion).getUrl()), mainHandler, null);
player.seekTo(0);


player.setPlayWhenReady(true); player.prepare(mediaSource);
داخل این کدی که نوشته شده به جای DefaultDataSourceFactory از ExtractorMediaSource استفاده کن.و یه Factory سفارشی برای خودت درست کن و allowCrossProtocolRedirects رو true قرار بده. فقط تو Constructor مربوط به DefaultDataSource باید اینطوری استفاده کنی
DefaultDataSource(Context context, String userAgent, boolean allowCrossProtocolRedirects)

mehdi.safavie
سه شنبه 22 بهمن 1398, 23:47 عصر
شاید این کد هم بتونه کمکت کنه
LoadControl loadControl = new DefaultLoadControl();



bandwidthMeter = new DefaultBandwidthMeter();
extractorsFactory = new DefaultExtractorsFactory();


trackSelectionFactory = new AdaptiveTrackSelection.Factory(bandwidthMeter);


trackSelector = new DefaultTrackSelector(trackSelectionFactory);
defaultBandwidthMeter = new DefaultBandwidthMeter();
dataSourceFactory = new DefaultDataSourceFactory(this,
Util.getUserAgent(this, "mediaPlayerSample"), defaultBandwidthMeter);




mediaSource = new ExtractorMediaSource(Uri.parse(radioURL), dataSourceFactory, extractorsFactory, null, null);


player = ExoPlayerFactory.newSimpleInstance(this, trackSelector, loadControl);
player.prepare(mediaSource);
player.setPlayWhenReady(true);

samiasoft
چهارشنبه 23 بهمن 1398, 16:16 عصر
متشکرم از راهنمایی شما

اما متاسفانه این دستوراتی که قرار دادید انگار به کتابخانه یا کلاس هایی وابسته هست که من نتونستم پیداشون کنم!

فکرمیکنم شما این را برای exoplayer استفاده کردید که این دستورات به کلاس اون وابسته است.

mehdi.safavie
پنج شنبه 24 بهمن 1398, 00:22 صبح
قصد ندارم تو ذوق برنامه نویسیه شما بزنم. از سوالات گوناگونی که تو این وبسایت کردید مشخصه که سطح پایینی ندارین.
اما معمولا اگر یه همچین کمک هایی میشه ، شما خودتون برین دنبال اون چیز هایی که گنگ هستن ، خیلی مورد های بیشتری گیرتون میاد.
باز اگر نمیتونین به مرادتون برسین ، نهایت باید کل کاری که میخواین رو بنده شخصا انجام بدم کد رو براتون بزارم. اما نصیحت برادرانه من تو تجربه چند ساله ای که داشتم اینه که حتی اگر سر نخ اشتباه هم دادیم به شما ، سر نخ رو دنبال کنین ، هم به مراد خودتون میرسین هم موارد بیشتری عایدتون میشه.

samiasoft
پنج شنبه 24 بهمن 1398, 01:43 صبح
قصد ندارم تو ذوق برنامه نویسیه شما بزنم. از سوالات گوناگونی که تو این وبسایت کردید مشخصه که سطح پایینی ندارین.
اما معمولا اگر یه همچین کمک هایی میشه ، شما خودتون برین دنبال اون چیز هایی که گنگ هستن ، خیلی مورد های بیشتری گیرتون میاد.
باز اگر نمیتونین به مرادتون برسین ، نهایت باید کل کاری که میخواین رو بنده شخصا انجام بدم کد رو براتون بزارم. اما نصیحت برادرانه من تو تجربه چند ساله ای که داشتم اینه که حتی اگر سر نخ اشتباه هم دادیم به شما ، سر نخ رو دنبال کنین ، هم به مراد خودتون میرسین هم موارد بیشتری عایدتون میشه.

فرمایشتون صحیح..بنده همیشه سعی میکنم قبل ایجاد تاپیک چه درسایت های خارجی و چه سایت و انجمن ها ایرانی جستجو کنم و اگر به نتیجه نرسیدم از راهنمایی شما دوستان عزیز استفاده کنم.... دراین مورد هم باور بفرمایید کل سایت ها رو زیرورو کردم حتی سایت خود اندروید اما در این زمینه هیچ موردی بدست نیاوردم به بن بست رسیدم !

همین مواردی هم که اشاره کردید رو من بررسی کردم که نمونه اون دستور رو برای mediaplayer بنویسیم که نتوانستم.....فعلا جهت رفع مشکل اومدم در این نسخه از اندروید ها بجای https از http استفاده کردم تا مشکلی رخ نده.

if (Build.VERSION.SDK_INT <= 19){ url=url.replace("https","http");
}
مطمئنا از پلیرهایی مثل exoplayer استفاده کنم با همین دستوراتی که نوشتید این مشکلات رو نخواهم داشت.