PDA

View Full Version : کمک در مورد Broadcast receiver



azbddk
جمعه 29 خرداد 1394, 15:28 عصر
سلام دوستان کسی می دونه چطور باید یه برودکست بنویسم که وقتی باتری گوشی پرشد یه صدا شروع به پخش شدن بشه؟

لطفاً یه مثال کامل بنویسید چون هر مثالی که داخل اینترنت دیدم کار نکرده

dalmif
جمعه 29 خرداد 1394, 16:23 عصر
سلام دوست عزیز.
ببینید شما می تونید با کد پایین در منیفست اعلام کنید که اگه باتری تغییری کرد یعنی از 78% رسید به 79% بردکست بردکست رسیور شما فراخوانی بشه


<receiver android:name=".BatteryLevelActivity">
<intent-filter>
<action android:name="android.intent.action.BATTERY_CHANGED" />
</intent-filter>
</receiver>

بعد در اون رسیورتون از کد پایین استفاده کنید.


public class BatteryLevelActivity extends BroadcastReceiver{


@Override
public void onReceive(Context context, Intent intent) {
int level = intent.getIntExtra("level", 0);
Toast.makeText(context, "Battery Level is "+level+"%", Toast.LENGTH_LONG) ;


}
}

در کد بالا با کم یا زیاد شدن باتری یه تست میده که درونش میزان باتری رو مینوسه.
الان شما یه شرط if بنویسید که اگه level شد 100 مثلا یه صدایی پخش بشه.
اگه مشکلی بود در خدمتم.
یا علی مدد

azbddk
جمعه 29 خرداد 1394, 23:25 عصر
کار نکرد متأسفانه راستی می خوام وقتی که برنامه بسته هست این کارو انجام بده

tux-world
شنبه 30 خرداد 1394, 08:24 صبح
به احتمال قوی کدی که نوشتید و دارید استفاده میکنید اشتباه نوشتید. راهنمایی دوستمون کاملا صحیح هستش . کدتون رو بزارید بررسی کنیم

azbddk
شنبه 30 خرداد 1394, 11:25 صبح
به احتمال قوی کدی که نوشتید و دارید استفاده میکنید اشتباه نوشتید. راهنمایی دوستمون کاملا صحیح هستش . کدتون رو بزارید بررسی کنیم

این کد manifest

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="btc.ald.ir.batterycycle" >

<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
<uses-permission android:name="android.permission.BLUETOOTH" />
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN" />
<uses-permission android:name="android.permission.WRITE_SETTINGS" />
<uses-permission android:name="android.permission.CHANGE_NETWORK_STATE" />
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
<uses-permission android:name="android.permission.KILL_BACKGROUND_PROCESSES" />
<uses-permission android:name="android.permission.BATTERY_STATS" />

<application
android:allowBackup="true"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
<activity
android:name=".MainActivity"
android:label="@string/app_name" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />

<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>

</activity>
<activity android:name=".optimize" >
</activity>

<activity android:name=".Tab" >
</activity>
<activity android:name=".Mods" >
</activity>
<activity android:name=".settings" >
</activity>
<service android:enabled="true" android:name=".MyService" />
<receiver android:name=".BootReciever">
<intent-filter >
<action android:name="android.intent.action.ACTION_POWER_CONNECTED" />
<action android:name="android.intent.action.ACTION_POWER_DISCONNECTED" />
</intent-filter>
</receiver>
<receiver android:name=".BatteryLevelActivity">
<intent-filter>
<action android:name="android.intent.action.BATTERY_CHANGED" />
</intent-filter>
</receiver>
</application>

</manifest>

این کد BatteryLevelActivity


package btc.ald.ir.batterycycle;


import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.media.MediaPlayer;
import android.widget.Toast;

public class BatteryLevelActivity extends BroadcastReceiver{
MediaPlayer mp = null;// Here
private static final String TAG = "VPET";

@Override
public void onReceive(Context context, Intent intent) {
int level = intent.getIntExtra("level", 0);
Toast.makeText(context, "Battery Level is " + level + "%", Toast.LENGTH_LONG) ;
mp = MediaPlayer.create(context, R.raw.a);//Onreceive gives you context
mp.start();// and this to play it
mp.setLooping(false);
}
}

azbddk
یک شنبه 31 خرداد 1394, 15:57 عصر
دوستان کسی نمیدونه مشکل کجاست؟

tux-world
یک شنبه 31 خرداد 1394, 19:56 عصر
میشه بگید که SDK رو توی مانیفست کجا تعریف کردید؟ نمیبینم

azbddk
یک شنبه 31 خرداد 1394, 20:08 عصر
مگه باید تعریف بشه

تو اندروید استدیو تو هیچ پروژه ای داخل مانیفست SDK تعریف نمیشه

dalmif
یک شنبه 31 خرداد 1394, 23:08 عصر
فکر کنم منظور ایشون همون sdk هست که استفاده می کنید.



<uses-sdk
android:minSdkVersion="10"
android:targetSdkVersion="21" />

azbddk
دوشنبه 01 تیر 1394, 00:01 صبح
ببخشید من یه کد پیدا کردم اون درست شد ولی این کد یه مشکل داره وقتی که برنامه اجرا شد متن Toast به صورت مکرر نشان داده می شود در صورتی که من می خواهم وقتی که یه بار نشون داد دیگه نشون نده.در واقع سرویس به طور مکرر ادامه پیدا می کنه که اگه یه کد نوشته باشم که بگه یه صدا رو پخش کنه صدا به طور مکرر پخش می شه من نمی خوام اینطور باشه.اگه میشه در رابطه با این کمک کنین. اینم کدهام:

import android.app.Service;
import android.content.BroadcastReceiver;
import android.content.Intent;
import android.content.IntentFilter;
import android.os.IBinder;

public class BTService extends Service
{
BroadcastReceiver mReceiver;

public IBinder onBind(Intent paramIntent)
{
return null;
}

public void onCreate()
{
IntentFilter localIntentFilter = new IntentFilter("android.intent.action.BATTERY_OKAY");
localIntentFilter.addAction("android.intent.action.BATTERY_LOW");
localIntentFilter.addAction("android.intent.action.BATTERY_CHANGED");
this.mReceiver = new lockScreenReeiver();
registerReceiver(this.mReceiver, localIntentFilter);
super.onCreate();
}

public void onDestroy()
{
unregisterReceiver(this.mReceiver);
super.onDestroy();
}

public void onStart(Intent paramIntent, int paramInt)
{
super.onStart(paramIntent, paramInt);
}
}


import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.util.Log;
import android.widget.Toast;

public class lockScreenReeiver extends BroadcastReceiver
{

public void onReceive(Context paramContext, Intent paramIntent)
{
boolean bool = paramIntent.getBooleanExtra("present", false);
int i = paramIntent.getIntExtra("level", -1);
int j = paramIntent.getIntExtra("scale", -1);
int k = 0;
Log.i("BatteryLevel", paramIntent.getExtras().toString());
if ((bool) && (i >= 0) && (j > 0))
k = i * 100 / j;
if (paramIntent.getAction().equals("android.intent.action.BATTERY_CHANGED"))
{
if ((k == 27))
{
Toast.makeText(paramContext, "this is my Toast message!!! =)",
Toast.LENGTH_LONG).show();
}
}
}
}

اینم کد صدا زدن سرویس در صفحه اصلی برنامه

protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
startService(new Intent(this,BTService.class));
}

اینم مانیفست

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="btc.ald.ir.batterycycle" >

<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
<uses-permission android:name="android.permission.BLUETOOTH" />
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN" />
<uses-permission android:name="android.permission.WRITE_SETTINGS" />
<uses-permission android:name="android.permission.CHANGE_NETWORK_STATE" />
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
<uses-permission android:name="android.permission.KILL_BACKGROUND_PROCESSES" />
<uses-permission android:name="android.permission.BATTERY_STATS" />

<application
android:allowBackup="true"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
<activity
android:name=".MainActivity"
android:label="@string/app_name" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />

<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>

</activity>
<activity android:name=".optimize" >
</activity>

<activity android:name=".Tab" >
</activity>
<activity android:name=".Mods" >
</activity>
<activity android:name=".settings" >
</activity>
<service android:enabled="true" android:name=".MyService" />
<service android:enabled="true" android:name=".BTService" />
<receiver android:name=".BootReciever">
<intent-filter >
<action android:name="android.intent.action.ACTION_POWER_CONNECTED" />
<action android:name="android.intent.action.ACTION_POWER_DISCONNECTED" />
</intent-filter>
</receiver>
<receiver android:name=".lockScreenReeiver">
<intent-filter >
<action android:name="android.intent.action.ACTION_BATTERY_LOW" />
<action android:name="android.intent.action.ACTION_BATTERY_OKAY" />
<action android:name="android.intent.action.BOOT_COMPLETED" />
</intent-filter>
</receiver>
</application>

</manifest>

tux-world
دوشنبه 01 تیر 1394, 08:38 صبح
کار اون برودکست هم همینه. شما باید مدیریتش کنید. برای مثال میتونید از share preference استفاده کنید و اگه یکبار گرفتید پیام رو مجددا بررسی کنید و دیگه ادامه ندید Toast رو