2

我对 Android 上的 Bump API 有很大的问题。我设置了示例中的所有内容,第一次启动包含凹凸代码的活动时效果很好,现在如果我返回并再次启动它,它就会由于致命信号错误而崩溃......它发生在我打电话后凹凸 API 的配置。

我可以不用再打电话了吗?但是没有什么可以检查它是否已经配置。

public class BumpActivity extends Activity {
    private IBumpAPI api;
    private ProgressDialog mDialog;

    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.bump);
        mDialog = ProgressDialog.show(BumpActivity.this, "Preparing bump", "Loading");
        bindService(new Intent(IBumpAPI.class.getName()), connection,
                Context.BIND_AUTO_CREATE);

        IntentFilter filter = new IntentFilter();
        filter.addAction(BumpAPIIntents.CHANNEL_CONFIRMED);
        filter.addAction(BumpAPIIntents.DATA_RECEIVED);
        filter.addAction(BumpAPIIntents.NOT_MATCHED);
        filter.addAction(BumpAPIIntents.MATCHED);
        filter.addAction(BumpAPIIntents.CONNECTED);
        registerReceiver(receiver, filter);

    }

    @Override
    public void onConfigurationChanged(Configuration newConfig) {
        super.onConfigurationChanged(newConfig);
    }

    @Override 
    public void onBackPressed(){
        Intent resultIntent = new Intent();
        setResult(Activity.RESULT_CANCELED, resultIntent);
        super.onBackPressed(); 
    }
    private final ServiceConnection connection = new ServiceConnection() {
        @Override
        public void onServiceConnected(ComponentName className, IBinder binder) {

            Log.i("BumpTest", "onServiceConnected");
            api = IBumpAPI.Stub.asInterface(binder);
            new Thread() {
                public void run() {
                    try {
                        api.configure("9b17d663752843a1bfa4cc72d309339e",
                                "Bump User");
                    } catch (RemoteException e) {
                        Log.w("BumpTest", e);
                    }

                }
            }.start();
            Log.d("Bump Test", "Service connected");
        }

        @Override
        public void onServiceDisconnected(ComponentName className) {
            Log.d("Bump Test", "Service disconnected");
        }
    };

    private final BroadcastReceiver receiver = new BroadcastReceiver() {
        @Override
        public void onReceive(Context context, Intent intent) {
            final String action = intent.getAction();
            try {
                if (action.equals(BumpAPIIntents.DATA_RECEIVED)) {
                    getUserDetailFromBump(new String(
                            intent.getByteArrayExtra("data")));
                } else if (action.equals(BumpAPIIntents.MATCHED)) {
                    long channelID = intent
                            .getLongExtra("proposedChannelID", 0);
                    Log.i("Bump Test",
                            "Matched with: "
                                    + api.userIDForChannelID(channelID));
                    api.confirm(channelID, true);
                    Toast toast = Toast.makeText(
                            getApplicationContext(),
                            "Matched with: "
                                    + api.userIDForChannelID(channelID),
                            Toast.LENGTH_SHORT);
                    toast.show();
                } else if (action.equals(BumpAPIIntents.CHANNEL_CONFIRMED)) {
                    long channelID = intent.getLongExtra("channelID", 0);
                    api.send(channelID, CurrentUserManager.getSharedManager()
                            .getCurrentUser().getUserId().toString().getBytes());
                } else if (action.equals(BumpAPIIntents.NOT_MATCHED)) {
                    Toast toast = Toast.makeText(getApplicationContext(),
                            "No match", Toast.LENGTH_SHORT);
                    toast.show();
                } else if (action.equals(BumpAPIIntents.CONNECTED)) {
                    mDialog.dismiss(); 
                    api.enableBumping();
                }
            } catch (RemoteException e) {
            }
        }
    };

    public void getUserDetailFromBump(String data) {
        Log.i("User Id", data); 
        LoginRequest login = new LoginRequest(getApplicationContext());
        Log.i("Token", login.getArchivedToken()); 
        AsyncHttpClient restRequest = new AsyncHttpClient();
        PersistentCookieStore cookie = new PersistentCookieStore(getApplicationContext()); 
        restRequest.setCookieStore(cookie); 
        RequestParams params = new RequestParams();
        params.put("auth_token", login.getArchivedToken()); 
        params.put("user_id", data); 
        Log.i("Request", "Preparing"); 
        restRequest.get(Constantes.API_URL + "users/show.json", params, new AsyncHttpResponseHandler(){
            public void onSuccess(String response) {
                Log.i("Reponse", response); 
                try {
                    User user = new User(new JSONObject(response));
                    Log.i("User", user.toString()); 
                    //Driver
                    if (CurrentUserManager.getSharedManager().getCurrentUser().getType() == 1){
                        CurrentRouteManager.getSharedManager().getCurrentRoute().addPassanger(user); 
                        Intent resultIntent = new Intent(BumpActivity.this, DriverActivity.class);
                        resultIntent.putExtra("PASSENGER_ADDED", true); 
                        setResult(1, resultIntent);
                        finish(); 
                    }
                    else{
                        Intent p = new Intent(BumpActivity.this, RoutePassenger.class); 
                        p.putExtra("driver", user); 
                        startActivity(p); 
                    }
                } catch (JSONException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                } 
            }

            @Override
            public void onFailure(Throwable e) {
                Log.i("Error", e.toString()); 
            }

        }); 

    }

    public void onStart() {
        Log.i("BumpTest", "onStart");
        super.onStart();
    }

    public void onRestart() {
        Log.i("BumpTest", "onRestart");
        super.onRestart();
    }

    public void onResume() {
        Log.i("BumpTest", "onResume");

        super.onResume();
    }

    public void onPause() {
        Log.i("BumpTest", "onPause");
        try {
            api.disableBumping();

        } catch (RemoteException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } 
        super.onPause();
    }

    public void onStop() {
        Log.i("BumpTest", "onStop");
        try {
            api.disableBumping();

        } catch (RemoteException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } 
        super.onStop();
    }

    public void onDestroy() {
        Log.i("BumpTest", "onDestroy");
        try {
            api.disableBumping();

        } catch (RemoteException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } 
        unbindService(connection);
        unregisterReceiver(receiver);
        super.onDestroy();
    }

}
4

2 回答 2

4

几天前我终于解决了。由于我不是 JAVA 专家,我认为该错误位于 Bump 库中。如果你在已经配置好的时候执行 api.configure,它只会崩溃。所以我最终制作了一个单例,确保它只被调用一次

这是代码

public class BumpConnection {

    protected Context context; 
    private IBumpAPI api;
    private static BumpConnection sharedManager;
    public static synchronized BumpConnection getSharedManager(Context context) {
        if (sharedManager == null) {
            sharedManager = new BumpConnection(context);
        }
        return sharedManager;
    }

    private BumpConnection(Context context){
        this.context = context; 
        context.bindService(new Intent(IBumpAPI.class.getName()), connection,
                Context.BIND_AUTO_CREATE);
    }



    public IBumpAPI getApi() {
        return api;
    }

    public void setApi(IBumpAPI api) {
        this.api = api;
    }



    private final ServiceConnection connection = new ServiceConnection() {
        @Override
        public void onServiceConnected(ComponentName className, IBinder binder) {

            Log.i("BumpTest", "onServiceConnected");
            api = IBumpAPI.Stub.asInterface(binder);
            new Thread() {
                public void run() {
                    try {
                        api.configure("9b17d663752843a1bfa4cc72d309339e",
                                "Bump User");
                    } catch (RemoteException e) {
                        Log.w("BumpTest", e);
                    }

                }
            }.start();
            Log.d("Bump Test", "Service connected");
        }

        @Override
        public void onServiceDisconnected(ComponentName className) {
            Log.d("Bump Test", "Service disconnected");
        }
    };
} 
于 2012-07-16T15:58:41.757 回答
-1

使用 git hub 上提供的最新的 bump api,仔细阅读 README.md 文件。有明确提到,通过使用 .aidl 文件(在 src 文件夹中可用)首先使用命令编译它

android 更新项目 -t android-15 -l path_to/bump-api-library -p path_to_your_project/

在您的终端中.. 如果您是 Linux 用户,则将路径设置为平台工具,然后将此命令与 ./adb 一起使用。

然后刷新项目,将此库项目设置为您的测试凹凸项目中的库。同时替换您通过电子邮件收到的凹凸 API 密钥

于 2013-06-18T07:57:21.457 回答