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. タワーチェンジ時にレシーバーからアクティビティを開始します。インテントを使用して、受信者からアクティビティを開始します。例:上記の点については、このアラームの例、アラームの例を参照してください

  2. レシーバーをAndroidManifest.xmlに登録します。

  3. レシーバークラスからブロードキャストメッセージを送信し、レシーバー内のDBも更新します。
  4. あなたの活動で同じことをキャッチします。これにはカスタムブロードキャストを使用できます。
  5. 次に、アクティビティでアラームをアクティブにします。

これらの手順がお役に立てば幸いです。私が言及した例を参照してください。

于 2012-11-05T08:27:39.990 に答える