আমার অ্যাপ্লিকেশন থেকে স্ট্যান্ডার্ড গুগল ম্যাপ অ্যাপ্লিকেশনটি কীভাবে খুলবেন?


140

একবার ব্যবহারকারী আমার অ্যাপ্লিকেশনটিতে বোতাম টিপলে আমি মানক গুগল ম্যাপ অ্যাপ্লিকেশনটি খুলতে এবং নির্দিষ্ট অবস্থানটি দেখতে চাই। আমি এটা কিভাবে করবো? (ব্যবহার না করে com.google.android.maps.MapView)

উত্তর:


241

আপনার Intentএকটি ভূ-ইউআরআই দিয়ে একটি বিষয় তৈরি করা উচিত :

String uri = String.format(Locale.ENGLISH, "geo:%f,%f", latitude, longitude);
Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(uri));
context.startActivity(intent);

আপনি একটি ঠিকানা নির্দিষ্ট করতে চান, আপনি ভূ-URI এর অন্য ফর্ম ব্যবহার করা উচিত: geo:0,0?q=address

তথ্যসূত্র: https://developer.android.com/guide/components/intents-common.html# মানচিত্র


1
ধন্যবাদ, @ পিক্সি! অক্ষাংশ এবং দ্রাঘিমাংশের বিন্যাসটি কী? যদি আমি পাস lat: 59.915494, lng: 30.409456করি তবে এটি ভুল অবস্থানে ফিরে আসে।
এলএ_

2
ঠিক আছে, আমি সমস্যাটি খুঁজে পেয়েছি। String.format("geo:%f,%f", latitude, longitude)ফিরে কমা দিয়ে: STRING geo:59,915494,30,409456
এলএ_

20
এটি আমাকে লোকেশনে নিয়ে যায় তবে এটি সেখানে কোনও বেলুন রাখেনি। আমি একটি বালুন পছন্দ করব যাতে ব্যবহারকারী এটির জন্য দিকনির্দেশ ইত্যাদি পেতে ক্লিক করতে পারেন
মাইক

5
স্ট্রিং.ফর্ম্যাট () এর সাথে স্ট্রিং কনকনটেইনেশনের জন্য গোলযোগ করবেন না। এই পদ্ধতিটি কেবলমাত্র ইউআই পাঠ্যের জন্যই বোঝানো হয়, এজন্য দশমিক পয়েন্টের নিন্দা আলাদা হতে পারে। কেবলমাত্র "+" অপারেটর বা স্ট্রিংবিল্ডার ব্যবহার করুন: স্ট্রিং ইউরি = "জিও:" + সর্বশেষ অবস্থান.সেটলটিটিড () + "," + সর্বশেষ অবস্থান.সাগরণীয় দৈর্ঘ্য ()।
আগুস্তে সানচেজ

4
দিকনির্দেশগুলির জন্য, এখন একটি নেভিগেশন উদ্দেশ্য গুগল.নভিগেশন: q = অক্ষাংশ, দ্রাঘিমাংশ: উরি জিএমআইআইএনটিএনটিউরি = উরি.পারস ("গুগল.নভিগেশন: q =" + 12f "+", "+ 2f); সমর্থন সহ মানচিত্রের ইনডেন্ট = নতুন ইনট্যান্ট (ইনটেন্ট.এ্যাকশন_ভিউ, জিএমএমআইএনটিএনটিউরি); ম্যাপইঞ্জেন্ট.সেটপ্যাকেজ ("com.google.android.apps.maps"); স্টার্টঅ্যাক্টিভিটি (ম্যাপ ইন্টেন্ট);
ডেভিড থম্পসন

105

আপনি সহজেই আপনার ইউআরআই হিসাবে http://maps.google.com/maps ব্যবহার করতে পারেন

String uri = "http://maps.google.com/maps?saddr=" + sourceLatitude + "," + sourceLongitude + "&daddr=" + destinationLatitude + "," + destinationLongitude;
Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(uri));
startActivity(intent);

অথবা আপনি নিশ্চিত করতে পারেন যে গুগল ম্যাপস অ্যাপটি কেবল ব্যবহৃত হয়েছে, এটি ব্যবহার করে ইন্টেন্ট ফিল্টার (সংলাপ) প্রদর্শিত হতে থামিয়ে দেয়

intent.setPackage("com.google.android.apps.maps");

তাই ভালো:

String uri = "http://maps.google.com/maps?saddr=" + sourceLatitude + "," + sourceLongitude + "&daddr=" + destinationLatitude + "," + destinationLongitude;
Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(uri));
intent.setPackage("com.google.android.apps.maps");
startActivity(intent);

অথবা আপনি প্রতিটি সেট স্থানাঙ্কের পরে বন্ধনীগুলির মধ্যে স্ট্রিং যুক্ত করে অবস্থানগুলিতে লেবেল যুক্ত করতে পারেন:

String uri = "http://maps.google.com/maps?saddr=" + sourceLatitude + "," + sourceLongitude + "(" + "Home Sweet Home" + ")&daddr=" + destinationLatitude + "," + destinationLongitude + " (" + "Where the party is at" + ")";
Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(uri));
intent.setPackage("com.google.android.apps.maps");
startActivity(intent);

ব্যবহারকারীদের বর্তমান অবস্থানটি প্রারম্ভিক পয়েন্ট হিসাবে ব্যবহার করতে (দুর্ভাগ্যক্রমে আমি বর্তমান অবস্থানের লেবেল দেওয়ার কোনও উপায় খুঁজে পাইনি) তারপরে কেবলমাত্র saddrপ্যারামিটারটি নীচে ছেড়ে দিন :

String uri = "http://maps.google.com/maps?daddr=" + destinationLatitude + "," + destinationLongitude + " (" + "Where the party is at" + ")";
Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(uri));
intent.setPackage("com.google.android.apps.maps");
startActivity(intent);

সম্পূর্ণতার জন্য, যদি ব্যবহারকারী মানচিত্রের অ্যাপ্লিকেশন ইনস্টল না করে থাকে তবে এটি অ্যাক্টিভিটি নটফাউন্ডএক্সেপশন ধরার জন্য ভাল ধারণা হতে চলেছে, যেমন @ টনিকিউতে বলা হয়েছে, তবে আমরা মানচিত্রের অ্যাপ্লিকেশন নিষেধাজ্ঞা ব্যতীত আবার ক্রিয়াকলাপ শুরু করতে পারি, আমরা বেশ নিশ্চিত হতে পারি ইন্টারনেট ব্রাউজারটি এই ইউআরএল স্কিমটিও প্রবর্তন করার জন্য একটি বৈধ অ্যাপ্লিকেশন হওয়ায় আমরা শেষ পর্যন্ত টোস্টে উঠতে পারব না।

        String uri = "http://maps.google.com/maps?daddr=" + 12f + "," + 2f + " (" + "Where the party is at" + ")";
        Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(uri));
        intent.setPackage("com.google.android.apps.maps");
        try
        {
            startActivity(intent);
        }
        catch(ActivityNotFoundException ex)
        {
            try
            {
                Intent unrestrictedIntent = new Intent(Intent.ACTION_VIEW, Uri.parse(uri));
                startActivity(unrestrictedIntent);
            }
            catch(ActivityNotFoundException innerEx)
            {
                Toast.makeText(this, "Please install a maps application", Toast.LENGTH_LONG).show();
            }
        }

সম্পাদনা করুন:

দিকনির্দেশগুলির জন্য, একটি নেভিগেশন উদ্দেশ্য এখন google.navigation দ্বারা সমর্থিত

Uri navigationIntentUri = Uri.parse("google.navigation:q=" + 12f + "," + 2f);
Intent mapIntent = new Intent(Intent.ACTION_VIEW, navigationIntentUri);
mapIntent.setPackage("com.google.android.apps.maps");
startActivity(mapIntent);

java.util.Illegal FormatConversionException:% f java.lang কে ফর্ম্যাট করতে পারে না।
স্ট্রিং

আপনি কোডের প্রথম লাইনটি [স্ট্রিং ইউরি = স্ট্রিং.ফোর্ম্যাট দিয়ে শুরু হওয়া লাইনের সাথে পোস্ট করেছেন] পোস্ট করুন] দেখে মনে হচ্ছে আপনার প্যারামিটারগুলির একটির মতো স্ট্রিং রয়েছে যা ভাসা হওয়া উচিত
ডেভিড থম্পসন

আরে যখন আমি অক্ষাংশ এবং দ্রাঘিমাংশ সহ Google মানচিত্রগুলিতে লেবেলটি পার করছি, মানচিত্র অ্যাপ্লিকেশন লেবেলটিকে ঠিকানাগুলিতে রূপান্তর করে। আপনি কি দয়া করে বলতে পারেন যে এই সমস্যাটি কীভাবে সমাধান করা যায়?
রোহান শর্মা

41

স্ট্রিং ফর্ম্যাট ব্যবহার করা আপনাকে সহায়তা করবে তবে আপনাকে অবশ্যই লোকালের সাথে পূর্ণ যত্নশীল হতে হবে। জার্মানি ভাসা কমে কমে পরিবর্তে একটি পয়েন্ট সঙ্গে পৃথক করা হবে।

String.format("geo:%f,%f",5.1,2.1);স্থানীয় ইংরেজী ব্যবহার করে ফলাফলটি হবে "geo:5.1,2.1"তবে স্থানীয় স্থানীয় সাথে আপনি পাবেন"geo:5,1,2,1"

এই আচরণটি রোধ করতে আপনার ইংরেজি লোকেল ব্যবহার করা উচিত।

String uri = String.format(Locale.ENGLISH, "geo:%f,%f", latitude, longitude);
Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(uri));
context.startActivity(intent);

জিও পয়েন্টে একটি লেবেল সেট করতে আপনি ব্যবহার করে আপনার জিও ইউরি প্রসারিত করতে পারেন:

!!! তবে এটিকে নিয়ে যত্নশীল হোন জিও-ইউরি এখনও তাত্পর্যপূর্ণ http://tools.ietf.org/html/traft-mayrhofer-geo-uri-00 এর অধীনে রয়েছে

String uri = String.format(Locale.ENGLISH, "geo:%f,%f?z=%d&q=%f,%f (%s)", 
                           latitude, longitude, zoom, latitude, longitude, label);
Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(uri));
context.startActivity(intent);

আপনি উপগ্রহ বা মানচিত্রের স্তর প্রদর্শনে কল করার জন্য "& t = h" বনাম "& টি = এম" ব্যবহার করতে পারেন।
টনি গিল

1
আমি স্থানাঙ্কগুলির সাথে একটি কোয়েরি যুক্ত করছি যাতে আমি একটি বেলুন পেতে পারি তার বাইরে কিছু অনুরূপ চেষ্টা করছি। আমার কোডটি আপনার প্রথম উদাহরণের মতো দেখায়। আমি ইংরাজী স্থানীয় লোকাল দিয়ে ইউআরআই ফর্ম্যাট করি তবে আমি যখন এটি আমার ডিভাইসে জার্মান লোকালে সেট করা ব্যবহার করি তখন গুগল ম্যাপস তখনও বিন্দুগুলি কমা দিয়ে প্রতিস্থাপন করে যাতে আমার কোয়েরিটি কাজ করে না। আমি যখন ডিভাইসের লোকেল ইংলিশ মার্কিন ফে তে সেট করি তখন এটি পুরোপুরি ঠিকঠাক কাজ করে। আমি কি করতে পারি? গুগল ম্যাপ কিউইয়ের স্ট্রিং আবার পরিবর্তন করে তা বিবেচ্য নয়।
কওলিক

8

গুগল থেকে এই পৃষ্ঠাটি দেখুন:

http://developer.android.com/guide/appendix/g-app-intents.html

আপনি ফর্মের একটি ইউআরআই ব্যবহার করতে পারেন

geo:latitude,longitude

গুগল ম্যাপ ভিউয়ার খুলতে এবং এটিকে কোনও লোকেশনে নির্দেশ করতে।


6

কখনও কখনও জিও: প্রোটোকলের সাথে যুক্ত কোনও অ্যাপ্লিকেশন না থাকলে আপনি এটি পরিচালনা করতে অ্যাক্টিভিটি নটফাউন্ডএক্সসেপশন পেতে ট্রাই-ক্যাচ ব্যবহার করতে পারেন।

আপনি যখন androVM এর মতো কিছু এমুলেটর ব্যবহার করেন যা ডিফল্টরূপে গুগল ম্যাপ ইনস্টল হয় না।


6

আপনি নীচের কোড স্নিপেটও ব্যবহার করতে পারেন, এই পদ্ধতিতে গুগল মানচিত্রের অস্তিত্বটি উদ্দেশ্য শুরু করার আগে পরীক্ষা করা হয়।

Uri gmmIntentUri = Uri.parse(String.format(Locale.ENGLISH,"geo:%f,%f", latitude, longitude));
Intent mapIntent = new Intent(Intent.ACTION_VIEW, gmmIntentUri);
mapIntent.setPackage("com.google.android.apps.maps");
if (mapIntent.resolveActivity(getPackageManager()) != null) {
    startActivity(mapIntent);
}

তথ্যসূত্র: https://developers.google.com/maps/docamentation/android-api/intents


1

এতে পিনের সাথে লোকেশন যেতে, ব্যবহার করুন:

String uri = "http://maps.google.com/maps?q=loc:" + destinationLatitude + "," + destinationLongitude;
Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(uri));
intent.setPackage("com.google.android.apps.maps");
startActivity(intent);

বিনা পিনের জন্য, ইউরিতে এটি ব্যবহার করুন:

 String uri = "geo:" + destinationLatitude + "," + destinationLongitude;

0

আমার একটি নমুনা অ্যাপ্লিকেশন রয়েছে যেখানে আমি অভিপ্রায় প্রস্তুত করি এবং মানচিত্র চিহ্নিতকারী ক্রিয়াকলাপের উদ্দেশ্যে অভিপ্রায় কেবল CITY_NAME পাস করি যা শেষ পর্যন্ত CITY_NAME ব্যবহার করে জিওকডার দ্বারা দ্রাঘিমাংশ এবং অক্ষাংশ গণনা করে।

নীচে মানচিত্র চিহ্নিতকারী ক্রিয়াকলাপ এবং সম্পূর্ণ মানচিত্রকারক ক্রিয়াকলাপ শুরু করার কোড স্নিপেট রয়েছে।

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    // Handle action bar item clicks here. The action bar will
    // automatically handle clicks on the Home/Up button, so long
    // as you specify a parent activity in AndroidManifest.xml.
    int id = item.getItemId();

    //noinspection SimplifiableIfStatement
    if (id == R.id.action_settings) {
        return true;
    } else if (id == R.id.action_refresh) {
        Log.d(APP_TAG, "onOptionsItemSelected Refresh selected");
        new MainActivityFragment.FetchWeatherTask().execute(CITY, FORECAS_DAYS);
        return true;
    } else if (id == R.id.action_map) {
        Log.d(APP_TAG, "onOptionsItemSelected Map selected");
        Intent intent = new Intent(this, MapsMarkerActivity.class);
        intent.putExtra("CITY_NAME", CITY);
        startActivity(intent);
        return true;
    }

    return super.onOptionsItemSelected(item);
}

public class MapsMarkerActivity extends AppCompatActivity
        implements OnMapReadyCallback {

    private String cityName = "";

    private double longitude;

    private double latitude;

    static final int numberOptions = 10;

    String [] optionArray = new String[numberOptions];

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        // Retrieve the content view that renders the map.
        setContentView(R.layout.activity_map);
        // Get the SupportMapFragment and request notification
        // when the map is ready to be used.
        SupportMapFragment mapFragment = (SupportMapFragment) getSupportFragmentManager()
                .findFragmentById(R.id.map);
        mapFragment.getMapAsync(this);

        // Test whether geocoder is present on platform
        if(Geocoder.isPresent()){
            cityName = getIntent().getStringExtra("CITY_NAME");
            geocodeLocation(cityName);
        } else {
            String noGoGeo = "FAILURE: No Geocoder on this platform.";
            Toast.makeText(this, noGoGeo, Toast.LENGTH_LONG).show();
            return;
        }
    }

    /**
     * Manipulates the map when it's available.
     * The API invokes this callback when the map is ready to be used.
     * This is where we can add markers or lines, add listeners or move the camera. In this case,
     * we just add a marker near Sydney, Australia.
     * If Google Play services is not installed on the device, the user receives a prompt to install
     * Play services inside the SupportMapFragment. The API invokes this method after the user has
     * installed Google Play services and returned to the app.
     */
    @Override
    public void onMapReady(GoogleMap googleMap) {
        // Add a marker in Sydney, Australia,
        // and move the map's camera to the same location.
        LatLng sydney = new LatLng(latitude, longitude);
        // If cityName is not available then use
        // Default Location.
        String markerDisplay = "Default Location";
        if (cityName != null
                && cityName.length() > 0) {
            markerDisplay = "Marker in " + cityName;
        }
        googleMap.addMarker(new MarkerOptions().position(sydney)
                .title(markerDisplay));
        googleMap.moveCamera(CameraUpdateFactory.newLatLng(sydney));
    }

    /**
     * Method to geocode location passed as string (e.g., "Pentagon"), which
     * places the corresponding latitude and longitude in the variables lat and lon.
     *
     * @param placeName
     */
    private void geocodeLocation(String placeName){

        // Following adapted from Conder and Darcey, pp.321 ff.
        Geocoder gcoder = new Geocoder(this);

        // Note that the Geocoder uses synchronous network access, so in a serious application
        // it would be best to put it on a background thread to prevent blocking the main UI if network
        // access is slow. Here we are just giving an example of how to use it so, for simplicity, we
        // don't put it on a separate thread.  See the class RouteMapper in this package for an example
        // of making a network access on a background thread. Geocoding is implemented by a backend
        // that is not part of the core Android framework, so we use the static method
        // Geocoder.isPresent() to test for presence of the required backend on the given platform.

        try{
            List<Address> results = null;
            if(Geocoder.isPresent()){
                results = gcoder.getFromLocationName(placeName, numberOptions);
            } else {
                Log.i(MainActivity.APP_TAG, "No Geocoder found");
                return;
            }
            Iterator<Address> locations = results.iterator();
            String raw = "\nRaw String:\n";
            String country;
            int opCount = 0;
            while(locations.hasNext()){
                Address location = locations.next();
                if(opCount == 0 && location != null){
                    latitude = location.getLatitude();
                    longitude = location.getLongitude();
                }
                country = location.getCountryName();
                if(country == null) {
                    country = "";
                } else {
                    country =  ", " + country;
                }
                raw += location+"\n";
                optionArray[opCount] = location.getAddressLine(0)+", "
                        +location.getAddressLine(1)+country+"\n";
                opCount ++;
            }
            // Log the returned data
            Log.d(MainActivity.APP_TAG, raw);
            Log.d(MainActivity.APP_TAG, "\nOptions:\n");
            for(int i=0; i<opCount; i++){
                Log.i(MainActivity.APP_TAG, "("+(i+1)+") "+optionArray[i]);
            }
            Log.d(MainActivity.APP_TAG, "latitude=" + latitude + ";longitude=" + longitude);
        } catch (Exception e){
            Log.d(MainActivity.APP_TAG, "I/O Failure; do you have a network connection?",e);
        }
    }
}

লিঙ্কগুলির মেয়াদ শেষ হয়ে গেছে তাই আমি উপরে সম্পূর্ণ কোডটি পেস্ট করেছি তবে ঠিক যদি আপনি সম্পূর্ণ কোড দেখতে চান তবে এটি এখানে পাওয়া যায়: https://github.com/gosaliajigar/CSC519/tree/master/CSC519_HW4_89753


0

এটি কোটলিনে লেখা আছে, এটি যদি মানচিত্রের অ্যাপ্লিকেশনটি খুঁজে পাওয়া যায় এবং এটি খুঁজে পাওয়া যায় এবং বিন্দুটি রাখে এবং আপনাকে ট্রিপ শুরু করতে দিন:

  val gmmIntentUri = Uri.parse("http://maps.google.com/maps?daddr=" + adapter.getItemAt(position).latitud + "," + adapter.getItemAt(position).longitud)
        val mapIntent = Intent(Intent.ACTION_VIEW, gmmIntentUri)
        mapIntent.setPackage("com.google.android.apps.maps")
        if (mapIntent.resolveActivity(requireActivity().packageManager) != null) {
            startActivity(mapIntent)
        }

requireActivity()আপনার সাথে প্রতিস্থাপন করুন Context

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.