0

近接アラートで配列を受信しようとしています。私が送ることができたのは、1つのロングだけです。これは私が近接アラートを設定する方法です:

private void setProximityAlert(double lat, double lon, final long eventID, int requestCode)
{
    float radius = 30f;
    LocationManager locManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);

    Intent intent = new Intent(PROXIMITY_INTENT_ACTION);
    intent.putExtra(ProximityAlert.EVENT_ID_INTENT_EXTRA, eventID);
    intent.putExtra("pole", mPositions);
    PendingIntent pendingIntent = PendingIntent.getBroadcast(getApplicationContext(), requestCode, intent, PendingIntent.FLAG_CANCEL_CURRENT);

    locManager.addProximityAlert(lat, lon, radius, -1, pendingIntent);
}

「intent.putExtra("pole", mPositions);」とコメントしてもクラッシュしません。

これは配列です:

private ArrayList<LatLonPair> mPositions;

そして、これはレシーバーです:

public class ProximityAlert extends BroadcastReceiver {

public static final String EVENT_ID_INTENT_EXTRA = "EventIDIntentExtraKey";

@Override
public void onReceive(Context context, Intent intent) {
    long eventID = intent.getLongExtra(EVENT_ID_INTENT_EXTRA, -1);
    ArrayList<LatLonPair> list = (ArrayList<LatLonPair>) intent.getSerializableExtra("list");
    Toast.makeText(context, "Event: " + eventID, Toast.LENGTH_SHORT).show();
}
}

1つの putExtra がなくても機能しますが、その配列が必要です。したがって、これは私にとってはうまくいきません: インテントによるオブジェクトの配列リスト

LogCat エラー:

FATAL EXCEPTION: main
 java.lang.RuntimeException: Unable to start activity ComponentInfo{co.uk.gauntface.android.proximityalerts/co.uk.gauntface.android.proximityalerts.ProximityDisplay}: java.lang.RuntimeException: Parcel: unable to marshal value co.uk.gauntface.android.proximityalerts.models.LatLonPair@44fb61f0
    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2663)
    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2679)
    at android.app.ActivityThread.access$2300(ActivityThread.java:125)
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2033)
    at android.os.Handler.dispatchMessage(Handler.java:99)
    at android.os.Looper.loop(Looper.java:123)
    at android.app.ActivityThread.main(ActivityThread.java:4627)
    at java.lang.reflect.Method.invokeNative(Native Method)
    at java.lang.reflect.Method.invoke(Method.java:521)
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626)
    at dalvik.system.NativeStart.main(Native Method)
 Caused by: java.lang.RuntimeException: Parcel: unable to marshal value co.uk.gauntface.android.proximityalerts.models.LatLonPair@44fb61f0
    at android.os.Parcel.writeValue(Parcel.java:1116)
    at android.os.Parcel.writeList(Parcel.java:510)
    at android.os.Parcel.writeValue(Parcel.java:1076)
    at android.os.Parcel.writeMapInternal(Parcel.java:479)
    at android.os.Bundle.writeToParcel(Bundle.java:1552)
    at android.os.Parcel.writeBundle(Parcel.java:493)
    at android.content.Intent.writeToParcel(Intent.java:5438)
    at android.app.ActivityManagerProxy.getIntentSender(ActivityManagerNative.java:2206)
    at android.app.PendingIntent.getBroadcast(PendingIntent.java:230)
    at co.uk.gauntface.android.proximityalerts.ProximityDisplay.setProximityAlert(ProximityDisplay.java:91)
    at co.uk.gauntface.android.proximityalerts.ProximityDisplay.registerIntents(ProximityDisplay.java:79)
    at co.uk.gauntface.android.proximityalerts.ProximityDisplay.onCreate(ProximityDisplay.java:43)
    at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047)
    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2627)
    ... 11 more

これは LatLonPair クラスです:

package co.uk.gauntface.android.proximityalerts.models;

import android.os.Parcel;
import android.os.Parcelable;

import com.google.android.maps.GeoPoint;

public class LatLonPair implements Parcelable{
private double mLatitude;
private double mLongitude;
private String popis;
private String nadpis;

public LatLonPair() {
    mLatitude = -2.60312596534349;
    mLongitude = 51.4558140934651;
    popis = "Nezadany popis";
    nadpis = "Nezadany nadpis";
}

public LatLonPair(double latitude, double longitude, String popis, String nadpis) {
    mLatitude = latitude;
    mLongitude = longitude;
    this.popis = popis;
    this.nadpis = nadpis;
}

public static boolean isValid(double lat, double lon) {

    if((lon >= -180 && lon <= 180) && (lat >= -90 && lat <= 90)) {
        return true;
    }

    return false;
}

public String getPopis() {
    return popis;
}

public String getNadpis() {
    return nadpis;
}

public void setLatitude(double latitude) {
    mLatitude = latitude;
}

public double getLatitude() {
    return mLatitude;
}

public void setLongitude(double longitude) {
    mLongitude = longitude;
}

public double getLongitude() {
    return mLongitude;
}

public GeoPoint getGeoPoint() {
    return new GeoPoint((int) (mLatitude * 1E6), (int) (mLongitude * 1E6));
}

@Override
public int describeContents() {
    // TODO Auto-generated method stub
    return 0;
}

@Override
public void writeToParcel(Parcel dest, int flags) {
    // TODO Auto-generated method stub

}

}

4

2 に答える 2

0

クラスsuper(dest,flags)でオーバーライドされたwriteToParcelメソッドを呼び出してみてくださいLatLonPair

于 2013-02-05T11:44:12.443 に答える
0

問題は、私が持っていなかっimplements Parceableたことと、その後持っていなかったことCREATEです。その後はクラッシュせず、配列の長さは問題ありませんでしたが、アイテムにはデフォルト値がありました。問題は、Parceable での変数の保存の不適切な実装にあったと思います-それ自体がリセットされました。そこで私はあきらめて、必要な数文字列だけをブロードキャストレシーバーに送信しました。助けてくれてありがとう。

于 2013-02-06T13:52:45.147 に答える