0

我的应用程序具有以下模块,

  1. 收集用户CB位置码。
  2. 要将其保存在用户选择的数据库中,例如我的 CB 代码是 465783,我可以将其保存为数据库中的“学院”。
  3. 为了提供警报功能,在这个模块中,我可以提供一个文本输入,说我将它作为“学院”,并且如果值学院匹配,则当单元广播更新时发出警报。

现在,在我下面的代码中,我已经实现了前 2 个模块以及所需的数据库条目、数据库搜索等,我无法读取更新的 CB 位置值。

public class Alarm extends MainActivity {

public String str;

public void onReceive(Context context, Intent intent) {
    //---get the CB message passed in---
    Bundle bundle = intent.getExtras();        
    SmsCbMessage[] msgs = null;
    str = "";            
    if (bundle != null)  {
        //---retrieve the SMS message received---
        Object[] pdus = (Object[]) bundle.get("pdus");
        msgs = new SmsCbMessage[pdus.length];            
        for (int i=0; i<msgs.length; i++) {
            msgs[i] = SmsCbMessage.createFromPdu((byte[])pdus[i]);                
            str += "CB " + msgs[i].getGeographicalScope() + msgs[i].getMessageCode() + msgs[i].getMessageIdentifier() + msgs[i].getUpdateNumber();                     
            str += " :";
            str += "\n";        
        }
        }
        }


EditText user_value;
Button startalarm;
Button stopalarm;


/** Called when the activity is first created. */
@Override
 public void onCreate(Bundle savedInstanceState) 
{
 super.onCreate(savedInstanceState);
 setContentView(R.layout.third);

 startalarm = (Button) findViewById(R.id.startalarm);
 stopalarm = (Button) findViewById(R.id.stopalarm);
user_value = (EditText) findViewById(R.id.user_value);

final Ringtone ringtone;
ringtone = RingtoneManager.getRingtone(getBaseContext(),     RingtoneManager.getDefaultUri(RingtoneManager.TYPE_RINGTONE));

startalarm.setOnClickListener(new View.OnClickListener() 
{

public void onClick(View arg0)
{
        // TODO Auto-generated method stub
if(user_value.length()==0)
{
    Toast.makeText(getBaseContext(), "Please enter a value.", Toast.LENGTH_LONG).show();
}

    Toast.makeText(getApplicationContext(), "alarm set", Toast.LENGTH_LONG).show();

//I want my alarm event to be started from here whenever a new CB sms arrives.

SQLiteDatabase aa = openOrCreateDatabase("MLIdata", MODE_WORLD_READABLE, null);
    Cursor c = aa.rawQuery("SELECT CblocationName FROM MLITable WHERE CblocationCode = '"+str+"'", null);
    c.moveToFirst();
    c.getString(c.getColumnIndex("CblocationName"));
    String sas = user_value.getText().toString();
    if(sas.equals(c.getString(c.getColumnIndex("CblocationName"))))
    {
        //here comes the alarm code


        if(ringtone == null)
        {
            Log.d("Debug", "ringtone is null");
        }
        else
        {
            ringtone.play();

        }
    }
}


});

stopalarm.setOnClickListener(new View.OnClickListener() {

public void onClick(View v) {
    // TODO Auto-generated method stub
    ringtone.stop();
}
});
}
}

详细说明:每当用户进入新的塔位置时,他都会从塔中获取更新的小区广播消息,因此当此 cbsms 到达时,我需要开始检索 CB 区号并将其与我的区号数据库(其中显然有用户设置的相应区号名称)并且当用户给定区名的相应区号与我当前的区号匹配时,需要启动警报,这里我无法检测到更新的位置。

如果我的问题陈述需要进一步解释,请发表评论。

从下面收到的评论中,我推断我需要一个接收器类,我为我的小部件创建了一个具有相同功能的小部件(在小部件上显示 Cb 位置代码),现在我不知道如何激活在我的应用程序中。

我的 WidgetReceiver.java

public class CbReceiver extends BroadcastReceiver
    {


        public void onReceive(Context context, Intent intent) {
            //---get the CB message passed in---
            Bundle bundle = intent.getExtras();        
            SmsCbMessage[] msgs = null;
            String str = "";            
            if (bundle != null)  {
                //---retrieve the SMS message received---
                Object[] pdus = (Object[]) bundle.get("pdus");
                msgs = new SmsCbMessage[pdus.length];            
                for (int i=0; i<msgs.length; i++) {
                    msgs[i] = SmsCbMessage.createFromPdu((byte[])pdus[i]);                
                    str += "CB " + msgs[i].getGeographicalScope() + msgs[i].getMessageCode() + msgs[i].getMessageIdentifier() + msgs[i].getUpdateNumber();                     
                    str += " :";
                    str += msgs[i].getMessageBody().toString();
                    str += "\n";       

                abortBroadcast();
                Toast.makeText(context, str, Toast.LENGTH_LONG).show();

                    AppWidgetManager appWidgetManager =     AppWidgetManager.getInstance(context);
            RemoteViews remoteViews = new RemoteViews(context.getPackageName(),R.layout.widget);
            ComponentName thisWidget = new ComponentName(context,MyWidget.class);
            remoteViews.setTextViewText(R.id.update,str);
            appWidgetManager.updateAppWidget(thisWidget, remoteViews);

        }                         
    }}
}

需要帮助。

谢谢你。

4

1 回答 1

1
  1. 从您的接收器开始您的活动,以更换塔。使用 Intent 从接收器开始您的活动。示例:请参阅此警报示例以了解以上几点,警报示例

  2. 在 Android Manifest.xml 中注册您的接收器。

  3. 从接收器类发送广播消息也会更新接收器内的数据库。
  4. 在你的活动中抓住同样的东西。您可以为此使用自定义广播。
  5. 现在激活您的活动警报。

希望这些步骤对您有所帮助。参考我提到的例子。

于 2012-11-05T08:27:39.990 回答