Как показать текущее местоположение на изображении IndoorAtlas Floorplan?

Я загружаю изображение плана этажа Indoor Atlas, но как я могу показать свое положение на этом изображении.. Также это изображение статично, пожалуйста, помогите.

Код для загрузки плана этажа приведен ниже.

public void loadFloorPlanImage(FloorPlan floorPlan) 
{
    BitmapFactory.Options options = createBitmapOptions(floorPlan);
    FutureResult<Bitmap> result = mIndoorAtlas.fetchFloorPlanImage(floorPlan,options);
    result.setCallback(new ResultCallback<Bitmap>() {
        @Override
        public void onResult(final Bitmap result) {
            runOnUiThread(new Runnable() {
                @Override
                public void run() {
                    ImageView imageView = (ImageView)    findViewById(R.id.imageView);
                    imageView.setImageBitmap(result);
                }
        });
        }
    });
}

Время от времени я получаю позицию, я просто отмечаю эту позицию в ImageView, мой код..

public void onServiceUpdate (состояние ServiceState) {

       double x1 = state.getMetricPoint().getX();
        double y1 = state.getMetricPoint().getY();
        float x = (float) x1;
        float y = (float) y1;

        //Paint paint = new Paint();
        Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG);
        paint.setAntiAlias(true);
        paint.setColor(Color.RED);

        Bitmap workingBitmap = Bitmap.createBitmap(image);
        Bitmap mutableBitmap = workingBitmap.copy(Bitmap.Config.ARGB_8888, true);

        Canvas canvas = new Canvas(mutableBitmap);
       // canvas.drawCircle(x, y, 100, paint);
        canvas.drawCircle(50, 50, 10, paint);

        imageView.setAdjustViewBounds(true);
        imageView.setImageBitmap(image);

}

Но это не работает. Пожалуйста, помогите Спасибо


person Imran Ahmad    schedule 30.05.2015    source источник
comment
Вы нашли решение? Я застрял в одном и том же, но на моем холсте ничего не рисуется ... любая помощь будет оценена по достоинству.   -  person Apurva Agrawal    schedule 29.07.2015
comment
Да, я закончил с этим. где ты застрял? Покажи свой код.   -  person Imran Ahmad    schedule 30.07.2015
comment
@ImranAhmad, не могли бы вы дать мне ссылку на Gradle для этого. Я не могу импортировать FloorPlan из IndoorAtlas android sdk gradle link.   -  person Savin Sharma    schedule 22.12.2016


Ответы (1)


import java.io.IOException;
import android.app.Activity;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Matrix;
import android.graphics.Paint;
import android.os.Bundle;
import android.util.Log;
import android.view.Menu;
import android.view.MenuItem;
import android.widget.ImageView;
import com.indooratlas.android.CalibrationState;
import com.indooratlas.android.FloorPlan;
import com.indooratlas.android.FutureResult;
import com.indooratlas.android.IndoorAtlas;
import com.indooratlas.android.IndoorAtlasException;
import com.indooratlas.android.IndoorAtlasFactory;
import com.indooratlas.android.IndoorAtlasListener;
import com.indooratlas.android.ResultCallback;
import com.indooratlas.android.ServiceState;

/**
 * <p>
 * Activity to demonstrate basic use of IndoorAtlas SDK. If there are no public
 * maps around your location, you can create a map of your own and upload it to
 * IndoorAtlas servers. Read more on how to do this from:
 * http://developer.indooratlas.com.
 * </p>
 * <p/>
 * <p>
 * To run this demo, you will also need your applications API key/secret and
 * identifiers for the floor plan from http://developer.indooratlas.com.
 * </p>
 * <p/>
 */
public class MainActivity extends Activity implements IndoorAtlasListener {

    private static final String TAG = "MainActivity";

    // private ListView mLogView;
    // private LogAdapter mLogAdapter;

    private IndoorAtlas mIndoorAtlas;
    private boolean mIsPositioning;
    private StringBuilder mSharedBuilder = new StringBuilder();
    private String apiKey = "YOU API KEY";
    private String apiSecret = "YOUR SECRET KEY";
    private String floorPlanId = "CUSTOM FLOOR PLAN ID";
    private String venueId = "CUSTOM VENUE ID";
    private String floorId = "CUSTOM FLOOR ID";
    private FloorPlan mFloorPlan;
    private ImageView imageView1;
    private Bitmap bitmap;

    private Bitmap copy;

    @Override
    public void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);
        setContentView(R.layout.map_layout);
        imageView1 = (ImageView) findViewById(R.id.imageView1);
        // mLogView = (ListView) findViewById(R.id.list);
        // mLogAdapter = new LogAdapter(this);
        // mLogView.setAdapter(mLogAdapter);

        initIndoorAtlas();

    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        tearDown();
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.menu_main, menu);
        return super.onCreateOptionsMenu(menu);
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        switch (item.getItemId()) {
        case R.id.action_clear_log:
            // mLogAdapter.clear();
            return true;
        case R.id.action_toggle_positioning:
            togglePositioning();
            return true;
        default:
            return super.onOptionsItemSelected(item);
        }
    }

    private void tearDown() {
        if (mIndoorAtlas != null) {
            mIndoorAtlas.tearDown();
        }
    }

    private void stopPositioning() {
        mIsPositioning = false;
        if (mIndoorAtlas != null) {
            log("Stop positioning");
            mIndoorAtlas.stopPositioning();
        }
    }

    private void startPositioning() {
        if (mIndoorAtlas != null) {
            log(String
                    .format("startPositioning, venueId: %s, floorId: %s, floorPlanId: %s",
                            venueId, floorId, floorPlanId));
            try {
                mIndoorAtlas.startPositioning(venueId, floorId, floorPlanId);
                mIsPositioning = true;
            } catch (IndoorAtlasException e) {
                log("startPositioning failed: " + e);
            }
        } else {
            log("calibration not ready, cannot start positioning");
        }
    }

    private void togglePositioning() {
        if (mIsPositioning) {
            stopPositioning();
        } else {
            startPositioning();
        }
    }

    private void initIndoorAtlas() {

        try {
            log("Connecting with IndoorAtlas, apiKey: " + apiKey);
            // obtain instance to positioning service, note that calibrating
            // might begin instantly
            mIndoorAtlas = IndoorAtlasFactory.createIndoorAtlas(
                    getApplicationContext(), this, // IndoorAtlasListener
                    apiKey, apiSecret);
            log("IndoorAtlas instance created");
            FutureResult<FloorPlan> result = mIndoorAtlas
                    .fetchFloorPlan(floorPlanId);
            result.setCallback(new ResultCallback<FloorPlan>() {

                @Override
                public void onResult(final FloorPlan result) {
                    mFloorPlan = result;
                    loadFloorPlanImage(result);
                }

                @Override
                public void onApplicationError(IndoorAtlasException arg0) {
                    // TODO Auto-generated method stub

                }

                @Override
                public void onSystemError(IOException arg0) {
                    // TODO Auto-generated method stub

                }
                // handle error conditions too
            });
            try {
                Log.d("abcd", "helo14");
                mIndoorAtlas.startPositioning(venueId, floorId, floorPlanId);
                Log.d("abcd", "helo1");
            } catch (IndoorAtlasException e) {
                // TODO Auto-generated catch block
                Log.d("abcd", "helo");
                e.printStackTrace();
            }
            togglePositioning();
        } catch (IndoorAtlasException ex) {
            Log.e("IndoorAtlas", "init failed", ex);
            log("init IndoorAtlas failed, " + ex.toString());
        }

    }

    private void updateImageViewInUiThread(final Bitmap result) {
        runOnUiThread(new Runnable() {

            @Override
            public void run() {
                bitmap = result;
                imageView1.setImageBitmap(result);
            }
        });
    }

    void loadFloorPlanImage(FloorPlan floorPlan) {
        BitmapFactory.Options options = createBitmapOptions(floorPlan);
        FutureResult<Bitmap> result = mIndoorAtlas.fetchFloorPlanImage(
                floorPlan, options);
        result.setCallback(new ResultCallback<Bitmap>() {
            @Override
            public void onResult(final Bitmap result) {
                // now you have floor plan bitmap, do something with it
                updateImageViewInUiThread(result);
            }

            @Override
            public void onApplicationError(IndoorAtlasException arg0) {
                // TODO Auto-generated method stub

            }

            @Override
            public void onSystemError(IOException arg0) {
                // TODO Auto-generated method stub

            }
            // handle error conditions too
        });
    }

    private void log(final String msg) {
        Log.d(TAG, msg);
        runOnUiThread(new Runnable() {
            @Override
            public void run() {
                // mLogAdapter.add(msg);
                // mLogAdapter.notifyDataSetChanged();
            }
        });
    }

    /* IndoorAtlasListener interface */

    /**
     * This is where you will handle location updates.
     */
    @Override
    public void onServiceUpdate(ServiceState state) {
        Log.d("abcd", "testttt");
        final Bitmap icon = BitmapFactory.decodeResource(
                getApplicationContext().getResources(), R.drawable.loc_img);
        // TODO Auto-generated method stub
        final int i = state.getImagePoint().getI();
        final int j = state.getImagePoint().getJ(); 
        Log.d("abcd", "" + i + "  " + j);   
        runOnUiThread(new Runnable() {
            @Override
            public void run() {
                if (bitmap != null) {
                    Bitmap copy2 = bitmap.copy(bitmap.getConfig(), true);
                    Canvas canvas = new Canvas(copy2);
                    Paint paint = new Paint(Paint.FILTER_BITMAP_FLAG);
                    canvas.drawBitmap(icon, i, j, paint);
                    imageView1.setImageBitmap(copy2);
                }           
            }
        });
        mSharedBuilder.setLength(0);
        mSharedBuilder.append("Location: ").append("\n\troundtrip : ")
                .append(state.getRoundtrip()).append("ms").append("\n\tlat : ")
                .append(state.getGeoPoint().getLatitude()).append("\n\tlon : ")
                .append(state.getGeoPoint().getLongitude())
                .append("\n\tX [meter] : ")
                .append(state.getMetricPoint().getX())
                .append("\n\tY [meter] : ")
                .append(state.getMetricPoint().getY())
                .append("\n\tI [pixel] : ")
                .append(state.getImagePoint().getI())
                .append("\n\tJ [pixel] : ")
                .append(state.getImagePoint().getJ()).append("\n\theading : ")
                .append(state.getHeadingDegrees()).append("\n\tuncertainty: ")
                .append(state.getUncertainty());
        log(mSharedBuilder.toString());
    }

    private BitmapFactory.Options createBitmapOptions(FloorPlan floorPlan) {
        BitmapFactory.Options options = null;
        int reqWidth = 2048;
        int reqHeight = 2048;
        final int width = (int) floorPlan.dimensions[0];
        final int height = (int) floorPlan.dimensions[1];
        int inSampleSize = 1;
        if (height > reqHeight || width > reqWidth) {
            final int halfHeight = height / 2;
            final int halfWidth = width / 2;            
            while ((halfHeight / inSampleSize) > reqHeight
                    && (halfWidth / inSampleSize) > reqWidth) {
                inSampleSize *= 2;
            }
        }
        if (options != null) {
            options.inSampleSize = inSampleSize;
        }
        return options;

    }

    private Bitmap overlay(Bitmap bmp1, Bitmap bmp2) {
        Bitmap bmOverlay = Bitmap.createBitmap(bmp1.getWidth(),
                bmp1.getHeight(), bmp1.getConfig());
        Canvas canvas = new Canvas(bmOverlay);
        canvas.drawBitmap(bmp1, new Matrix(), null);
        canvas.drawBitmap(bmp2, new Matrix(), null);
        return bmOverlay;
    }

    @Override
    public void onServiceFailure(int errorCode, String reason) {
        log("onServiceFailure: reason : " + reason);
    }

    @Override
    public void onServiceInitializing() {
        log("onServiceInitializing");
    }

    @Override
    public void onServiceInitialized() {
        log("onServiceInitialized");
    }

    @Override
    public void onInitializationFailed(final String reason) {
        log("onInitializationFailed: " + reason);
    }

    @Override
    public void onServiceStopped() {
        log("onServiceStopped");
    }

    @Override
    public void onCalibrationStatus(CalibrationState calibrationState) {
        log("onCalibrationStatus, percentage: "
                + calibrationState.getPercentage());
    }

    /**
     * Notification that calibration has reached level of quality that provides
     * best possible positioning accuracy.
     */
    @Override
    public void onCalibrationReady() {
        log("onCalibrationReady");
    }

    @Override
    public void onNetworkChangeComplete(boolean success) {
    }

    /**
     * @deprecated this callback is deprecated as of version 1.4
     */
    @Override
    public void onCalibrationInvalid() {
    }

    /**
     * @deprecated this callback is deprecated as of version 1.4
     */
    @Override
    public void onCalibrationFailed(String reason) {
    }     
}

Этот код может вам помочь. И перейдите по этой ссылке

person Ansal Ali    schedule 13.10.2015