Flutter-geolocator: μ „κ²½μ—μ„œλ§Œ μœ„μΉ˜μ— μ ‘κ·Ό κ°€λŠ₯

에 λ§Œλ“  2020λ…„ 10μ›” 04일  Β·  28μ½”λ©˜νŠΈ  Β·  좜처: Baseflow/flutter-geolocator

πŸš€ κΈ°λŠ₯ μš”μ²­

λͺ¨λ‘ μ•ˆλ…•ν•˜μ‹­λ‹ˆκΉŒ! Google은 μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ΄ Google Play에 κ²Œμ‹œλ˜κΈ° μœ„ν•΄ μ€€μˆ˜ν•΄μ•Ό ν•˜λŠ” κΆŒν•œ 및 μœ„μΉ˜ κΆŒν•œ 정책을 μ—…λ°μ΄νŠΈν–ˆμŠ΅λ‹ˆλ‹€.

μƒˆ 정책은 λ°±κ·ΈλΌμš΄λ“œμ—μ„œ μ‚¬μš©μžμ˜ μœ„μΉ˜μ— μ•‘μ„ΈμŠ€ν•  수 μžˆλŠ” κ°€λŠ₯성을 μ œν•œν•©λ‹ˆλ‹€. ν¬κ·ΈλΌμš΄λ“œμ—μ„œλ§Œ μœ„μΉ˜μ— μ•‘μ„ΈμŠ€ν•  수 μžˆλŠ” κ°€λŠ₯성이 있으면 쒋을 κ²ƒμž…λ‹ˆλ‹€.

특히 이제 λ§€λ‹ˆνŽ˜μŠ€νŠΈμ—μ„œ ACCESS_BACKGROUND_LOCATION κΆŒν•œμ„ μš”μ²­ν•˜κ³  여기에 제곡된 지침을 따라야 ν•©λ‹ˆλ‹€.

μ‘μš© ν”„λ‘œκ·Έλž¨μ΄ μƒˆ 정책을 μ€€μˆ˜ν•˜μ§€ μ•ŠλŠ” 경우 이와 μœ μ‚¬ν•œ 였λ₯˜ λ©”μ‹œμ§€μ™€ ν•¨κ»˜ μ—…λ°μ΄νŠΈκ°€ κ±°λΆ€λ©λ‹ˆλ‹€.
Background location access not declared We detected that your app contains at least one feature that requests background location access, however you have not submitted a permission declaration form for this feature. Please log in to your Play Console and submit a declaration form.

κΈ°λŠ₯의 λ§₯락화

μƒˆλ‘œμš΄ κΈ°λŠ₯을 μ‚¬μš©ν•˜κ±°λ‚˜ κΈ°μ‘΄ κΈ°λŠ₯에 λ§€κ°œλ³€μˆ˜λ₯Ό μΆ”κ°€ν•˜μ—¬ κ΅¬ν˜„ν•  수 μžˆλŠ” 두 가지 μƒˆλ‘œμš΄ κΈ°λŠ₯이 μžˆμ–΄μ•Ό ν•©λ‹ˆλ‹€.

  1. μ „κ²½ μœ„μΉ˜λ§Œ μš”μ²­
  2. κ°€λŠ₯ν•œ 경우 μ „κ²½ μœ„μΉ˜μ— μ•‘μ„ΈμŠ€ν•˜κ³  μ˜ˆμ™Έλ₯Ό λ°œμƒμ‹œν‚΅λ‹ˆλ‹€.

κΈ°λŠ₯ μ„€λͺ…

μ œμ•ˆλœ μˆ˜μ •μ„ 톡해 ν”„λ ˆμž„μ›Œν¬λŠ” 앱이 λ°±κ·ΈλΌμš΄λ“œμ— μžˆκ±°λ‚˜ κΊΌμ Έ μžˆμ„ λ•Œ μ–΄λ–€ μ’…λ₯˜μ˜ ν™œλ™λ„ μˆ˜ν–‰ν•˜μ§€ μ•Šκ³  μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ΄ ν™œμ„±ν™”λœ κ²½μš°μ—λ§Œ μ‚¬μš©μžμ˜ μœ„μΉ˜μ— μ•‘μ„ΈμŠ€ν•΄μ•Ό ν•©λ‹ˆλ‹€.

영ν–₯을 λ°›λŠ” ν”Œλž«νΌ(ν•΄λ‹Ή 사항 λͺ¨λ‘ ν‘œμ‹œ)

  • [ ] : 아이폰: iOS
  • [x] :λ‘œλ΄‡: μ•ˆλ“œλ‘œμ΄λ“œ
android needs more info

κ°€μž₯ μœ μš©ν•œ λŒ“κΈ€

@cguentherTUChemnitz 및 @arnerodde365 μΆ”κ°€ ν”Όλ“œλ°±μ„ μ œκ³΅ν•΄ μ£Όμ…”μ„œ κ°μ‚¬ν•©λ‹ˆλ‹€. 이제 AndroidManifest.xml νŒŒμΌμ— ACCESS_BACKGROUND_LOCATION κΆŒν•œμ„ ν¬ν•¨ν•˜λ©΄ Play μŠ€ν† μ–΄μ—μ„œ 앱을 κ±°λΆ€ν•  κ²ƒμž„μ„ 확인할 수 μžˆμŠ΅λ‹ˆλ‹€.

λ˜ν•œ 이것은 Geolocator ν”ŒλŸ¬κ·ΈμΈμ— μ˜ν•΄ μžλ™μœΌλ‘œ μΆ”κ°€λ˜μ§€ μ•Šμ§€λ§Œ λ‹€λ₯Έ ν”ŒλŸ¬κ·ΈμΈμ— μ˜ν•΄ 좔가될 수 μžˆμŒμ„ 확인할 수 μžˆμŠ΅λ‹ˆλ‹€(예: Location ν”ŒλŸ¬κ·ΈμΈμ΄ μžλ™μœΌλ‘œ μΆ”κ°€). ν•΄κ²° 방법이 μ •λ§λ‘œ ν•„μš”ν•œ μ‚¬λžŒλ“€μ„ μœ„ν•΄ λ‹€μŒμ„ AndroidManifest.xml에 <manifest ...> νƒœκ·Έμ˜ 직계 μžμ‹μœΌλ‘œ μΆ”κ°€ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

 <uses-permission android:name="android.permission.ACCESS_BACKGROUND_LOCATION" tools:node="remove"/>

μ΄λ ‡κ²Œ ν•˜λ©΄ λ‹€λ₯Έ ν”ŒλŸ¬κ·ΈμΈμ΄ AndroidManifest.xml νŒŒμΌμ— μΆ”κ°€ν•˜λ”λΌλ„ ACCESS_BACKGROUND_LOCATION κΆŒν•œμ΄ μ œκ±°λ©λ‹ˆλ‹€. 이것은 이 κΆŒν•œμ— μ˜μ‘΄ν•˜λŠ” ν”ŒλŸ¬κ·ΈμΈμ— λŒ€ν•΄ 예기치 μ•Šμ€ λ™μž‘μ„ μœ λ°œν•  수 μžˆμŠ΅λ‹ˆλ‹€.

이 λ¬Έμ œλŠ” Geolocator ν”ŒλŸ¬κ·ΈμΈ 자체둜 μΈν•œ 것이 μ•„λ‹ˆλΌκ³  μƒκ°ν•˜κΈ° λ•Œλ¬Έμ— μ§€κΈˆ 이 문제λ₯Ό λ‹«κ² μŠ΅λ‹ˆλ‹€.

λͺ¨λ“  28 λŒ“κΈ€

Fulvio, 해결책을 찾을 수 μžˆμŠ΅λ‹ˆκΉŒ? 저도 같은 λ¬Έμ œμž…λ‹ˆλ‹€.

저도 같은 λ¬Έμ œμž…λ‹ˆλ‹€. μ‹€μ œλ‘œ λ‚΄ 앱은 λ°±κ·ΈλΌμš΄λ“œμ—μ„œ μœ„μΉ˜λ₯Ό μ‚¬μš©ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€. ν•˜μ§€λ§Œ ꡬ글 ν”Œλ ˆμ΄λŠ” λ‚˜μ—κ²Œ λ§ν•œλ‹€ : 당신은 λ°±κ·ΈλΌμš΄λ“œμ—μ„œ μœ„μΉ˜μ—μ„œ μ‚¬μš©ν•˜κ³  μžˆμŠ΅λ‹ˆλ‹€. 이 ν”ŒλŸ¬κ·ΈμΈ λ•Œλ¬Έμ— μ‘μš© ν”„λ‘œκ·Έλž¨μ΄ λ°±κ·ΈλΌμš΄λ“œ μœ„μΉ˜μ— μ•‘μ„ΈμŠ€ν•  수 μžˆλŠ” κΆŒν•œμ΄ μžˆλ‹€κ³  μƒκ°ν•©λ‹ˆλ‹€.

ν”ŒλŸ¬κ·ΈμΈμ€ λ°±κ·ΈλΌμš΄λ“œμ—μ„œ μœ„μΉ˜μ— μ•‘μ„ΈμŠ€ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€. 많이 μš”μ²­ν•œ κΈ°λŠ₯μ΄μ§€λ§Œ 아직 κ΅¬ν˜„ν•˜μ§€ λͺ»ν–ˆμŠ΅λ‹ˆλ‹€.

AndroidManifest.xml νŒŒμΌμ— λ‚˜μ—΄λœ ACCESS_BACKGROUND_LOCATION κΆŒν•œμ΄ μžˆλŠ”μ§€ 확인할 수 μžˆμŠ΅λ‹ˆκΉŒ? κ·Έλ ‡λ‹€λ©΄ μ œκ±°ν•˜μ‹­μ‹œμ˜€. 이 ν”ŒλŸ¬κ·ΈμΈμ΄ μž‘λ™ν•˜λŠ” 데 ν•„μš”ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.

μš°λ¦¬λ„ 같은 λ¬Έμ œκ°€ μžˆμŠ΅λ‹ˆλ‹€... 이미 λ§€λ‹ˆνŽ˜μŠ€νŠΈ νŒŒμΌμ—μ„œ κΆŒν•œμ„ μ œκ±°ν•˜κ³  λ‹€λ₯Έ 패치λ₯Ό λ³΄λƒˆμ§€λ§Œ Googleμ—μ„œ λΉŒλ“œλ₯Ό 계속 κ±°λΆ€ν•©λ‹ˆλ‹€.

λͺ¨λ‘ 쒋은 μ•„μΉ¨μž…λ‹ˆλ‹€. @mvanbeusekom κ³ λ €

@marcuslindemannrohden μ €λŠ” μ˜ˆμ™Έλ₯Ό μ œμΆœν•˜μ§€ μ•Šκ³ (즉, 앱이 μƒˆ 정책을 μ€€μˆ˜ν•˜μ§€ μ•ŠλŠ”λ‹€κ³  μ„ μ–Έν•˜μ§€ μ•Šκ³ ) Play μŠ€ν† μ–΄μ—μ„œ μƒˆ λ²„μ „μ˜ μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ„ 아직 μΆœμ‹œν•˜μ§€ λͺ»ν–ˆμŠ΅λ‹ˆλ‹€.

ACCESS_BACKGROUND_LOCATION을 λ§€λ‹ˆνŽ˜μŠ€νŠΈμ— μΆ”κ°€ν•˜μ§€ μ•Šμ•˜μ§€λ§Œ 이 Google λ¦¬μ†ŒμŠ€ μ—μ„œ μ΄ν•΄ν•˜λŠ” ν•œ μš°λ¦¬κ°€ 29 미만의 API 버전을 λŒ€μƒμœΌλ‘œ ν•˜κΈ° λ•Œλ¬Έμ— κΆŒν•œμ΄ μžλ™μœΌλ‘œ μΆ”κ°€λ˜μ—ˆμŠ΅λ‹ˆλ‹€.

@mvanbeusekom (λ¬Όλ‘  이 μ§ˆλ¬Έμ€ 이 라이브러리의 λͺ¨λ“  μ‚¬μš©μžλ₯Ό λŒ€μƒμœΌλ‘œ ν•©λ‹ˆλ‹€ 😊) 10μ›” ν•œ 달 λ™μ•ˆ μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ„ κ²Œμ‹œν•˜κ±°λ‚˜ μ—…λ°μ΄νŠΈν•  수 μžˆμ—ˆλ‚˜μš”? μ΄λŸ¬ν•œ μ˜λ―Έμ—μ„œ κ·€ν•˜μ˜ κ²½ν—˜μ„ κ³΅μœ ν•˜λ©΄ 맀우 도움이 될 κ²ƒμž…λ‹ˆλ‹€!

Goodmorning @fbambushi , 이 ν”Όλ“œλ°±μ— λŒ€ν•΄ λŒ€λ‹¨νžˆ κ°μ‚¬ν•©λ‹ˆλ‹€.

10μ›” μ΄ν›„λ‘œ 이 ν”ŒλŸ¬κ·ΈμΈμ΄ ν¬ν•¨λœ Play μŠ€ν† μ–΄μ— 앱을 μ œμΆœν•˜μ§€ μ•Šμ•˜μœΌλ―€λ‘œ 아직 이 λ™μž‘μ„ κ²½ν—˜ν•˜μ§€ λͺ»ν–ˆμŠ΅λ‹ˆλ‹€. κ·ΈλŸ¬λ‚˜ 제곡된 자료λ₯Ό μžμ„Ένžˆ μ‚΄νŽ΄λ³΄κ³  이해할 수 μžˆλŠ”μ§€ ν™•μΈν•˜κ³  κ°€λŠ₯ν•œ μ†”λ£¨μ…˜μ— λŒ€ν•΄ λ…Όμ˜ν•˜κΈ° μœ„ν•΄ μ—¬κΈ°μ—μ„œ μ—…λ°μ΄νŠΈλ₯Ό μ œκ³΅ν•  κ²ƒμž…λ‹ˆλ‹€. μ €λŠ” ν˜„μž¬ #546 및 #556 문제λ₯Ό ν•΄κ²°ν•˜κΈ° μœ„ν•΄ λ…Έλ ₯ν•˜κ³  있으며, λ°”λ‘œ κ·Έ 후에 이것을 선택할 κ²ƒμž…λ‹ˆλ‹€(λ‹€μŒ 주에 μ–΄λ”˜κ°€μ— μžˆμ„ κ²ƒμž…λ‹ˆλ‹€).

λˆ„κ΅°κ°€ κ°€λŠ₯ν•œ μ†”λ£¨μ…˜μ— λŒ€ν•œ μ œμ•ˆ 사항이 있으면 μ•Œλ €μ£Όμ‹­μ‹œμ˜€. 맀우 κ°μ‚¬ν•˜κ² μŠ΅λ‹ˆλ‹€.

ν”ŒλŸ¬κ·ΈμΈμ€ λ°±κ·ΈλΌμš΄λ“œμ—μ„œ μœ„μΉ˜μ— μ•‘μ„ΈμŠ€ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€. 많이 μš”μ²­ν•œ κΈ°λŠ₯μ΄μ§€λ§Œ 아직 κ΅¬ν˜„ν•˜μ§€ λͺ»ν–ˆμŠ΅λ‹ˆλ‹€.

AndroidManifest.xml νŒŒμΌμ— λ‚˜μ—΄λœ ACCESS_BACKGROUND_LOCATION κΆŒν•œμ΄ μžˆλŠ”μ§€ 확인할 수 μžˆμŠ΅λ‹ˆκΉŒ? κ·Έλ ‡λ‹€λ©΄ μ œκ±°ν•˜μ‹­μ‹œμ˜€. 이 ν”ŒλŸ¬κ·ΈμΈμ΄ μž‘λ™ν•˜λŠ” 데 ν•„μš”ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.

이 κΆŒν•œμ„ μ–Έμ œ μΆ”κ°€ν–ˆλŠ”μ§€ κΈ°μ–΅λ‚˜μ§€ μ•Šμ§€λ§Œ μ–΄μ œ 이 κΆŒν•œμ„ μ‚­μ œν•˜κ³  Google에 앱을 μ œμΆœν–ˆμŠ΅λ‹ˆλ‹€. λ§ˆμ§€λ§‰μœΌλ‘œ 방금 Googleμ—μ„œ λ‚΄ 앱을 μŠΉμΈν–ˆμŠ΅λ‹ˆλ‹€.
Google Play μ½˜μ†” μ„ μ–Έ μ–‘μ‹μ—μ„œ μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ΄ λ°±κ·ΈλΌμš΄λ“œμ—μ„œ μœ„μΉ˜λ₯Ό μ‚¬μš©ν•˜μ§€ μ•ŠλŠ”λ‹€κ³  μ„ μ–Έν•΄μ•Ό ν•©λ‹ˆλ‹€.

μ—¬λŸ¬λΆ„, 방금 Google Playμ—μ„œ μŠΉμΈμ„ λ°›μ•˜μŠ΅λ‹ˆλ‹€.
라이브러리 λ‚΄λΆ€μ˜ PermissionManager ν΄λž˜μŠ€μ— "ACCESS_BACKGROUND_LOCATION" κΆŒν•œμ΄ λΆ„λͺ…νžˆ ν¬ν•¨λ˜μ–΄ μžˆμŒμ„ λ°œκ²¬ν–ˆμŠ΅λ‹ˆλ‹€.
μ–΄μ œ Google에 μ œμΆœν•œ "ACCESS_FINE_LOCATION" 및 "ACCESS_COARSE_LOCATION" κΆŒν•œλ§Œ μ‚¬μš©ν•˜λ„λ‘ λ°±κ·ΈλΌμš΄λ“œ μœ„μΉ˜ 및 이λ₯Ό λ°˜ν™˜ν•  수 μžˆλŠ” λͺ¨λ“  쑰건과 κ΄€λ ¨λœ λͺ¨λ“  것을 μ œκ±°ν•˜λŠ” 클래슀λ₯Ό 둜컬둜 μˆ˜μ •ν–ˆμœΌλ©° μŠΉμΈλ˜μ—ˆμŠ΅λ‹ˆλ‹€.

μ‹€μ œλ‘œ μŠΉμΈμ— 영ν–₯을 λ―Έμ³€λŠ”μ§€ 확인할 μˆ˜λŠ” μ—†μ§€λ§Œ ν•„μš”ν•œ 경우
λ°°κ²½ μœ„μΉ˜λ₯Ό μ‚¬μš©ν•˜μ§€ μ•Šλ„λ‘ μˆ˜μ •λœ 클래슀λ₯Ό λ”°λ₯΄μ‹­μ‹œμ˜€.

package com.baseflow.geolocator.permission;

import android.Manifest;
import android.app.Activity;
import android.content.Context;
import android.content.pm.PackageManager;
import android.os.Build;
import android.util.Log;

import androidx.annotation.Nullable;
import androidx.core.app.ActivityCompat;
import androidx.core.content.ContextCompat;

import com.baseflow.geolocator.errors.ErrorCallback;
import com.baseflow.geolocator.errors.ErrorCodes;
import com.baseflow.geolocator.errors.PermissionUndefinedException;

import java.util.*;

import io.flutter.plugin.common.PluginRegistry;

public class PermissionManager
        implements PluginRegistry.RequestPermissionsResultListener {

    private static final int PERMISSION_REQUEST_CODE = 109;

    <strong i="10">@Nullable</strong>
    private Activity activity;
    <strong i="11">@Nullable</strong>
    private ErrorCallback errorCallback;
    <strong i="12">@Nullable</strong>
    private PermissionResultCallback resultCallback;

    public LocationPermission checkPermissionStatus(
            Context context,
            Activity activity) throws PermissionUndefinedException {
        String permission = determineFineOrCoarse(context);

        // If target is before Android M, permission is always granted
        if (Build.VERSION.SDK_INT < Build.VERSION_CODES.M) {
            return LocationPermission.whileInUse;
        }

        final int permissionStatus = ContextCompat.checkSelfPermission(context, permission);
        if (permissionStatus == PackageManager.PERMISSION_DENIED) {
            if (PermissionUtils.isNeverAskAgainSelected(activity, permission)) {
                return LocationPermission.deniedForever;
            } else {
                return LocationPermission.denied;
            }
        }

        if (Build.VERSION.SDK_INT < Build.VERSION_CODES.Q) {
            return LocationPermission.whileInUse;
        }


        return LocationPermission.whileInUse;
    }

    public void requestPermission(
            Activity activity,
            PermissionResultCallback resultCallback,
            ErrorCallback errorCallback)
            throws PermissionUndefinedException {
        final ArrayList<String> permissionsToRequest = new ArrayList<>();

        // Before Android M, requesting permissions was not needed.
        if (Build.VERSION.SDK_INT < Build.VERSION_CODES.M) {
            return;
        }

        String permission = determineFineOrCoarse(activity);
        permissionsToRequest.add(permission);



        this.errorCallback = errorCallback;
        this.resultCallback = resultCallback;
        this.activity = activity;

        ActivityCompat.requestPermissions(
                activity,
                permissionsToRequest.toArray(new String[0]),
                PERMISSION_REQUEST_CODE);
    }

    <strong i="13">@Override</strong>
    public boolean onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
        if (requestCode != PERMISSION_REQUEST_CODE) {
            return false;
        }

        if (this.activity == null) {
            Log.e("Geolocator", "Trying to process permission result without an valid Activity instance");
            if (this.errorCallback != null) {
                this.errorCallback.onError(ErrorCodes.activityNotSupplied);
            }
            return false;
        }

        String requestedPermission;

        try {
            requestedPermission = determineFineOrCoarse(this.activity);
        } catch (PermissionUndefinedException ex) {
            if (this.errorCallback != null) {
                this.errorCallback.onError(ErrorCodes.permissionDefinitionsNotFound);
            }

            return false;
        }

        LocationPermission permission = LocationPermission.denied;

        int requestedPermissionIndex = indexOf(permissions, requestedPermission);

        if (requestedPermissionIndex < 0) {
            Log.w("Geolocator", "Location permissions not part of permissions send to onRequestPermissionsResult method.");
            return false;
        }

        if (grantResults.length == 0) {
            Log.i("Geolocator", "The grantResults array is empty. This can happen when the user cancels the permission request");
            return false;
        }

        if (grantResults[requestedPermissionIndex] == PackageManager.PERMISSION_GRANTED) {
            permission = LocationPermission.whileInUse;
        } else {
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M && !activity.shouldShowRequestPermissionRationale(requestedPermission)) {
                permission = LocationPermission.deniedForever;
            }
        }

        for (String perm : permissions) {
            PermissionUtils.setRequestedPermission(activity, perm);
        }

        if (this.resultCallback != null) {
            this.resultCallback.onResult(permission);
        }

        return true;
    }

    private static <T> int indexOf(T[] arr, T val) {
        return Arrays.asList(arr).indexOf(val);
    }

    private static String determineFineOrCoarse(Context context) throws PermissionUndefinedException {
        boolean wantsFineLocation = PermissionUtils.hasPermissionInManifest(context, Manifest.permission.ACCESS_FINE_LOCATION);
        boolean wantsCoarseLocation = PermissionUtils.hasPermissionInManifest(context, Manifest.permission.ACCESS_COARSE_LOCATION);

        if (!wantsCoarseLocation && !wantsFineLocation) {
            throw new PermissionUndefinedException();
        }

        return wantsFineLocation ? Manifest.permission.ACCESS_FINE_LOCATION : Manifest.permission.ACCESS_COARSE_LOCATION;
    }

}

μ•ˆλ…•ν•˜μ„Έμš” @fbambushi , @marcuslindemannrohden , @eniserkaya ,

λ‚˜λŠ” 이것에 λŒ€ν•΄ μ½μ—ˆμœΌλ©° μ£Όμš” λ¬Έμ œλŠ” μœ„μΉ˜ μŠ€νŠΈλ¦Όμ„ 듀을 λ•Œ( Geolocator.getPositionStream() 방법을 μ‚¬μš©ν•˜μ—¬ μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ΄ μΌμ‹œ 쀑지(λ°±κ·ΈλΌμš΄λ“œλ‘œ μ„€μ •)될 λ•Œ 슀트림(ꡬ독 μ·¨μ†Œ).

λ˜ν•œ 버전 6.0.0 ~ 6.1.1μ—λŠ” μœ„μΉ˜ 슀트림이 ν™œμ„±ν™”λœ μƒνƒœμ—μ„œ getCurrentPosition λ©”μ„œλ“œλ₯Ό ν˜ΈμΆœν•˜λ©΄ μœ„μΉ˜ μŠ€νŠΈλ¦Όμ„ ν™œμ„±ν™” μƒνƒœλ‘œ λ‘˜ 수 μžˆλŠ” 버그가 ν¬ν•¨λ˜μ–΄ μžˆμŠ΅λ‹ˆλ‹€(문제 #485 및 #541 μ°Έμ‘°). 이 λ¬Έμ œλŠ” 버전 6.1.2μ—μ„œ ν•΄κ²°λ˜μ—ˆμŠ΅λ‹ˆλ‹€.

μš”μ•½ν•˜μžλ©΄:

  1. AndroidManifest.xml νŒŒμΌμ— ACCESS_BACKGROUND_LOCATION λ₯Ό ν¬ν•¨ν•˜μ§€ μ•Šμ•˜λŠ”μ§€ ν™•μΈν•˜μ‹­μ‹œμ˜€.
  2. 앱이 λ°±κ·ΈλΌμš΄λ“œλ‘œ 이동할 λ•Œ ν™œμ„± μœ„μΉ˜ μŠ€νŠΈλ¦Όμ„ ꡬ독 μ·¨μ†Œ/μ·¨μ†Œν•΄μ•Ό ν•©λ‹ˆλ‹€.
  3. Geolocator ν”ŒλŸ¬κ·ΈμΈ 버전 6.1.2둜 μ—…λ°μ΄νŠΈν–ˆλŠ”μ§€ ν™•μΈν•˜μ‹­μ‹œμ˜€.

μΆ”κ°€ μ •λ³΄λŠ” λ‹€μŒμ—μ„œ 찾을 수 μžˆμŠ΅λ‹ˆλ‹€.

@marcuslindemannrohden 이 PermissionManager ν΄λž˜μŠ€μ—μ„œ μ œκ±°ν•œ μ½”λ“œμ— λŒ€ν•œ μ•½κ°„μ˜ 언급은 ACCESS_BACKGROUND_LOCATION κΆŒν•œμ΄ AndroidManifest.xml νŒŒμΌμ— λ‚˜μ—΄λ˜μ–΄ μžˆλŠ” κ²½μš°μ—λ§Œ 이 μ½”λ“œμ—μ„œ λ°±κ·ΈλΌμš΄λ“œ κΆŒν•œμ„ μš”μ²­ν•©λ‹ˆλ‹€. μ—†λŠ” 경우 μš”μ²­λ˜μ§€ μ•ŠμœΌλ―€λ‘œ 앱에 μ „ν˜€ 영ν–₯을 λ―ΈμΉ˜μ§€ μ•ŠμœΌλ©° Googleμ—μ„œ 앱을 κ±°λΆ€ν•˜λŠ” μ΄μœ κ°€ λ˜μ–΄μ„œλ„ μ•ˆ λ©λ‹ˆλ‹€.

PS 이것이 도움이 λ˜λŠ”μ§€ μ•Œλ €μ£Όμ„Έμš”. getPositionStream κΈ°λŠ₯을 μ‚¬μš©ν•˜μ§€ μ•Šμ§€λ§Œ 이 ν”ŒλŸ¬κ·ΈμΈμ„ μ‚¬μš©ν•˜λŠ” μ—¬λŸ¬ 앱을 문제 없이 Google Play μŠ€ν† μ–΄μ— μ œμΆœν–ˆμŠ΅λ‹ˆλ‹€. getLastKnownPosition 및 getCurrentPosition κΈ°λŠ₯만 있으면 λ©λ‹ˆλ‹€. λ”°λΌμ„œ 이 μ£Όμ œμ— λŒ€ν•œ λ‹€λ₯Έ ν”Όλ“œλ°±μ€ λŒ€λ‹¨νžˆ κ°μ‚¬ν•©λ‹ˆλ‹€.

이에 λŒ€ν•œ μ—…λ°μ΄νŠΈκ°€ μžˆμŠ΅λ‹ˆκΉŒ? μ•± μŠΉμΈμ„ λ°›λŠ” 데 어렀움을 κ²ͺκ³  μžˆμŠ΅λ‹ˆλ‹€.

같은 λ‹΅μž₯ λ°›κΈ°:

λ°±κ·ΈλΌμš΄λ“œ μœ„μΉ˜ μ•‘μ„ΈμŠ€κ°€ μ„ μ–Έλ˜μ§€ μ•Šμ•˜μŠ΅λ‹ˆλ‹€. 앱에 λ°±κ·ΈλΌμš΄λ“œ μœ„μΉ˜ μ•‘μ„ΈμŠ€λ₯Ό μš”μ²­ν•˜λŠ” κΈ°λŠ₯이 ν•˜λ‚˜ 이상 ν¬ν•¨λ˜μ–΄ μžˆμŒμ„ κ°μ§€ν–ˆμ§€λ§Œ 이 κΈ°λŠ₯에 λŒ€ν•œ κΆŒν•œ μ„ μ–Έ 양식을 μ œμΆœν•˜μ§€ μ•Šμ•˜μŠ΅λ‹ˆλ‹€. Play Console에 λ‘œκ·ΈμΈν•˜μ—¬ μ‹ κ³ μ„œλ₯Ό μ œμΆœν•˜μ„Έμš”.

λ‚˜λŠ” getCurrentPosition 만 μ‚¬μš©ν•˜κ³  μžˆμŠ΅λ‹ˆλ‹€.
ACCESS_BACKGROUND_LOCATION κΆŒν•œμ€ ν¬ν•¨ν•˜μ§€ μ•Šκ³  ACCESS_FINE_LOCATION κΆŒν•œλ§Œ ν¬ν•¨ν•©λ‹ˆλ‹€.
μ΅œμ‹  버전 6.1.7을 μ‚¬μš©ν•˜κ³  μžˆμŠ΅λ‹ˆλ‹€.

μ €λŠ” API 레벨 29λ₯Ό λͺ©ν‘œλ‘œ ν•˜κ³  있으며 Developers.android μ—μ„œ μ΄ν•΄ν•œ 바에 λ”°λ₯΄λ©΄ 29 μ΄μƒμ—λŠ” ν¬κ·ΈλΌμš΄λ“œ μ„œλΉ„μŠ€ μœ ν˜•μ„ μΆ”κ°€ν•΄μ•Ό ν•©λ‹ˆλ‹€.

@arnerodde365 , μ œκ³΅ν•œ λ¬Έμ„œλ₯Ό 읽으면 <service 선언을 AndroidManifest.xml νŒŒμΌμ— μΆ”κ°€ν•˜κ³  android:foregroundServiceType 속성을 location :

<!-- Recommended for Android 9 (API level 28) and lower. -->
<!-- Required for Android 10 (API level 29) and higher. -->
<service
    android:name="MyNavigationService"
    android:foregroundServiceType="location" ... >
    <!-- Any inner elements would go here. -->
</service>

<service ...></service> 선언은 <application> μ„ μ–Έμ˜ ν•˜μœ„ ν•­λͺ©μœΌλ‘œ λ‚˜μ—΄λ˜μ–΄μ•Ό ν•©λ‹ˆλ‹€.

이 방법을 μ‹œλ„ν•΄ 보고 λ¬Έμ œκ°€ ν•΄κ²°λ˜μ—ˆλŠ”μ§€ μ•Œλ €μ£Όμ‹œλ©΄ κ°μ‚¬ν•˜κ² μŠ΅λ‹ˆλ‹€. κ·Έλ ‡λ‹€λ©΄ λ¬Έμ„œλ₯Ό μ—…λ°μ΄νŠΈν•˜κ³  이것이 README.md νŒŒμΌμ— μ–ΈκΈ‰λ˜μ–΄ μžˆλŠ”μ§€ ν™•μΈν•©λ‹ˆλ‹€.

그래 μ•Œλ €μ€„κ²Œ
ν•˜μ§€λ§Œ μ €λŠ” μ•± 개발이 처음이라 android:name= ""에 무엇을 λ„£μ–΄μ•Ό 할지 λͺ¨λ₯΄κ² μŠ΅λ‹ˆλ‹€

λ‚˜λŠ” 이것이 flutter-geolocator νŒ¨ν‚€μ§€μ˜ μ„œλΉ„μŠ€ 이름이어야 ν•œλ‹€κ³  μƒκ°ν•©λ‹ˆλ‹€.

@arnerodde365 μ›ν•˜λŠ” λͺ¨λ“  것이 κ°€λŠ₯ν•©λ‹ˆλ‹€. 그것은 μ‚¬μš©μž μ •μ˜ κ°’μ΄λ―€λ‘œ 쒋은 이름을 μ§€μ •ν•˜μ‹­μ‹œμ˜€ ;)

앱은 μ—¬μ „νžˆ β€‹β€‹λ™μΌν•œ μ‘λ‹΅μœΌλ‘œ κ±°λΆ€λ©λ‹ˆλ‹€.

λͺ¨λ“  μ—…λ°μ΄νŠΈ? λ‚΄ 컴파일 및 λŒ€μƒ SDK 버전이 29이고 AndroidManifest.xml νŒŒμΌμ— λ°±κ·ΈλΌμš΄λ“œ κΆŒν•œμ„ ν¬ν•¨ν•˜μ§€ μ•Šμ•˜μœΌλ©° μ•± λ²ˆλ“€ νƒμƒ‰κΈ°μ—μ„œ λ°±κ·ΈλΌμš΄λ“œ μœ„μΉ˜ κΆŒν•œμ„ μš”μ²­ν•˜κ³  μžˆμŒμ„ μ—¬μ „νžˆ ν‘œμ‹œν•˜κ³  μžˆμŠ΅λ‹ˆλ‹€.

루프λ₯Ό 더 짧게 μœ μ§€ν•˜λ €λ©΄ λ‹€μŒμ„ 톡해 Android μ•± λ²ˆλ“€μ„ λΉŒλ“œν•˜λŠ” 것이 μ’‹μŠ΅λ‹ˆλ‹€.

flutter build appbundle
Running Gradle task 'bundleRelease'...                             10.1s
βœ“ Built build/app/outputs/bundle/release/app-release.aab (132.6MB).

.aab νŒŒμΌμ„ μΆ”μΆœν•˜κ³  app-release/base/manifest/AndroidManifest.xml을 μ°ΎμŠ΅λ‹ˆλ‹€.

이 λ§€λ‹ˆνŽ˜μŠ€νŠΈ νŒŒμΌμ€ μ•± μŠ€ν† μ–΄μ—μ„œ ꡬ문 뢄석해야 ν•©λ‹ˆλ‹€. [...]android.permission.ACCESS_BACKGROUND_LOCATION[...] μžˆλŠ” ν•œ μ•±μŠ€ν† μ–΄λŠ” μ™œ ν•„μš”ν•œμ§€ μ μ ˆν•œ μ„€λͺ… 없이 κ±°λΆ€ν•©λ‹ˆλ‹€.

μ—¬κΈ°μ„œ λ¬Έμ œλŠ” μ—¬λŸ¬ ν”ŒλŸ¬ν„° ν”ŒλŸ¬κ·ΈμΈμ΄ Geolocator λ˜λŠ” μœ„μΉ˜ ν”ŒλŸ¬κ·ΈμΈκ³Ό 같이 이 ν•­λͺ©μ„ 자체적으둜 λ„μž…ν•œλ‹€λŠ” κ²ƒμž…λ‹ˆλ‹€.

λ”°λΌμ„œ μ—¬κΈ°μ—μ„œ λ…Όμ˜ 지점은 ν•„μš”ν•˜μ§€ μ•Šμ€ 경우 지리 μœ„μΉ˜ μ§€μ •κΈ°μ—μ„œ λ°±κ·ΈλΌμš΄λ“œ μœ„μΉ˜ κΆŒν•œ ν•­λͺ©μ„ μ œκ±°ν•˜λŠ” λ°©λ²•μœΌλ‘œ λ³€κ²½ν•΄μ•Ό ν•©λ‹ˆλ‹€.

@cguentherTUChemnitz 와 ν•¨κ»˜ 생각해 μ£Όμ…”μ„œ κ°μ‚¬ν•©λ‹ˆλ‹€. android.permission.ACCESS_BACKGROUND_LOCATION κ°€ Geolocator λ˜λŠ” λ‹€λ₯Έ ν”ŒλŸ¬κ·ΈμΈμ— μ˜ν•΄ 병합될 μˆ˜λ„ μžˆλ‹€κ³  μƒκ°ν–ˆμŠ΅λ‹ˆλ‹€.

λ”°λΌμ„œ Geolocator ν”ŒλŸ¬κ·ΈμΈκ³Ό κ΄€λ ¨λœ λͺ¨λ“  AndroidManifest.xml νŒŒμΌμ„ ν™•μΈν–ˆμ§€λ§Œ μ½”λ“œ λ² μ΄μŠ€μ—μ„œ μ–ΈκΈ‰λœ 이 νŠΉμ • κΆŒν•œμ„ 찾을 수 μ—†μŠ΅λ‹ˆλ‹€.

내일 λ‚˜λŠ” 당신이 μ–ΈκΈ‰ν•œ .aab νŒŒμΌμ„ λΆ„μ„ν•˜λŠ” μΆ”κ°€ ν…ŒμŠ€νŠΈλ₯Ό μ‹€ν–‰ν•˜κ³  Geolocatorκ°€ 이 ν•­λͺ©μ„ AndroidManifest.xml νŒŒμΌμ— λ„£λŠ”μ§€ ν™•μΈν•˜λ €κ³  ν•©λ‹ˆλ‹€.

닡변이 λŠ¦μ–΄ μ£„μ†‘ν•©λ‹ˆλ‹€. μƒˆ 버전이 λ‚˜μ™”μŠ΅λ‹ˆλ‹€.
κΆŒν•œ μ„ μ–Έ μ–‘μ‹μ—μ„œ 개인 정보 보호 μ •μ±… 지침을 λ”°λ₯΄μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.

이제 λ²ˆλ“€μ˜ λ§€λ‹ˆνŽ˜μŠ€νŠΈ νŒŒμΌμ— ACCESS_BACKGROUND_LOCATION 없이 이 ν”ŒλŸ¬κ·ΈμΈμ„ μ‚¬μš©ν•  수 μžˆλ‹€λŠ” 것도 확인할 수 μžˆμŠ΅λ‹ˆλ‹€. 제 κ²½μš°μ—λŠ” λ‹€λ₯Έ ν”ŒλŸ¬κ·ΈμΈμ΄ λ‚΄ ν”„λ‘œμ νŠΈμ— 이 ν”ŒλŸ¬κ·ΈμΈμ„ λ„μž…ν–ˆμŠ΅λ‹ˆλ‹€.

@cguentherTUChemnitz ν™•μΈν•΄μ£Όμ…”μ„œ λŒ€λ‹¨νžˆ κ°μ‚¬ν•©λ‹ˆλ‹€. 이 문제의 원인이 된 ν”ŒλŸ¬κ·ΈμΈμ„ κ³΅μœ ν•˜μ‹œκ² μŠ΅λ‹ˆκΉŒ? 이것은 λ‹€λ₯Έ μ‚¬λžŒλ“€μ—κ²Œλ„ 도움이 될 수 μžˆμŠ΅λ‹ˆλ‹€.

@arnerodde365 , 그것에 λŒ€ν•΄ κ±±μ •ν•˜μ§€ λ§ˆμ‹­μ‹œμ˜€. 이 λ¬Έμ œλŠ” AndroidManifest.xml νŒŒμΌμ— ACCESS_BACKGROUND_LOCATION κΆŒν•œμ„ μžλ™μœΌλ‘œ λ„μž…ν•˜λŠ” λ‹€λ₯Έ ν”ŒλŸ¬κ·ΈμΈ λ˜λŠ” νŒ¨ν‚€μ§€λ‘œ 인해 λ°œμƒν•  수 μžˆμŠ΅λ‹ˆλ‹€. pubspec.yaml (λ˜λŠ” dependencies μ„Ήμ…˜)의 λ‚΄μš©μ„ κ³΅μœ ν•  의ν–₯이 μžˆλ‹€λ©΄ 쒅속성을 ν™•μΈν•˜μ—¬ 문제λ₯Ό μΌμœΌν‚€λŠ” ν”ŒλŸ¬κ·ΈμΈμ„ 찾을 수 μžˆλŠ”μ§€ ν™•μΈν•˜κ² μŠ΅λ‹ˆλ‹€.

이 λ¬Έμ œκ°€ κΈ°λ³Έ Flutter λ¦¬ν¬μ§€ν† λ¦¬μ—μ„œλ„ 제기된 κ²ƒμœΌλ‘œ λ‚˜νƒ€λ‚¬μŠ΅λ‹ˆλ‹€(flutter/flutter#73461 μ°Έμ‘°).

  flutter_widget_from_html_core:  ^0.4.3      
  flutter_local_notifications:    ^1.4.4+2
  flutter_appcenter_bundle:       ^3.2.0+1
  shared_preferences:             ^0.5.6+2
  flutter_translate:              ^1.6.0
  redux_persist:                  ^0.8.3
  flutter_redux:                  ^0.6.0
  url_launcher:                   ^5.4.10
  package_info:                   ^0.4.0+13
  flutter_map:                    ^0.8.2
  geolocator:                     ^6.1.7
  provider:                       ^4.3.2+2
  geojson:                        ^0.9.1
  shimmer:                        ^1.1.2
  toast:                          ^0.1.5
  http:                           ^0.12.0+4
  intl:                           ^0.16.1

μŠ¬ν”„κ²Œλ„ 이 μ •λ³΄λŠ” λ‹€λ₯Έ μ‚¬λžŒλ“€μ—κ²Œ μ‹€μ œλ‘œ 도움이 λ˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€. 제 κ²½μš°μ—λŠ” λ™μΌν•œ ν”„λ‘œμ νŠΈμ—μ„œ μ‚¬μš©ν•˜λŠ” λΉ„κ³΅κ°œ ν”ŒλŸ¬κ·ΈμΈμ—μ„œ 이 κΆŒν•œμ„ 가지고 μžˆμ—ˆμŠ΅λ‹ˆλ‹€.

κ·ΈλŸ¬λ‚˜ 이제 앱이 μΆœμ‹œλ˜μ–΄ λ¬Έμ œκ°€ ν•΄κ²°λ˜μ—ˆμŠ΅λ‹ˆλ‹€. googleκ³Ό κ·Έλ“€μ˜ μ„ μ–Έ 양식에 λ¬Έμ œκ°€ μžˆλ‹€κ³  μƒκ°ν•©λ‹ˆλ‹€. Live 버전이 개인 정보 보호 정책을 λ”°λ₯΄μ§€ μ•Šμ•˜κΈ° λ•Œλ¬Έμ— λ² νƒ€μ—μ„œ 앱을 얻을 수 μ—†μ—ˆμŠ΅λ‹ˆλ‹€ ...

@cguentherTUChemnitz 및 @arnerodde365 μΆ”κ°€ ν”Όλ“œλ°±μ„ μ œκ³΅ν•΄ μ£Όμ…”μ„œ κ°μ‚¬ν•©λ‹ˆλ‹€. 이제 AndroidManifest.xml νŒŒμΌμ— ACCESS_BACKGROUND_LOCATION κΆŒν•œμ„ ν¬ν•¨ν•˜λ©΄ Play μŠ€ν† μ–΄μ—μ„œ 앱을 κ±°λΆ€ν•  κ²ƒμž„μ„ 확인할 수 μžˆμŠ΅λ‹ˆλ‹€.

λ˜ν•œ 이것은 Geolocator ν”ŒλŸ¬κ·ΈμΈμ— μ˜ν•΄ μžλ™μœΌλ‘œ μΆ”κ°€λ˜μ§€ μ•Šμ§€λ§Œ λ‹€λ₯Έ ν”ŒλŸ¬κ·ΈμΈμ— μ˜ν•΄ 좔가될 수 μžˆμŒμ„ 확인할 수 μžˆμŠ΅λ‹ˆλ‹€(예: Location ν”ŒλŸ¬κ·ΈμΈμ΄ μžλ™μœΌλ‘œ μΆ”κ°€). ν•΄κ²° 방법이 μ •λ§λ‘œ ν•„μš”ν•œ μ‚¬λžŒλ“€μ„ μœ„ν•΄ λ‹€μŒμ„ AndroidManifest.xml에 <manifest ...> νƒœκ·Έμ˜ 직계 μžμ‹μœΌλ‘œ μΆ”κ°€ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

 <uses-permission android:name="android.permission.ACCESS_BACKGROUND_LOCATION" tools:node="remove"/>

μ΄λ ‡κ²Œ ν•˜λ©΄ λ‹€λ₯Έ ν”ŒλŸ¬κ·ΈμΈμ΄ AndroidManifest.xml νŒŒμΌμ— μΆ”κ°€ν•˜λ”λΌλ„ ACCESS_BACKGROUND_LOCATION κΆŒν•œμ΄ μ œκ±°λ©λ‹ˆλ‹€. 이것은 이 κΆŒν•œμ— μ˜μ‘΄ν•˜λŠ” ν”ŒλŸ¬κ·ΈμΈμ— λŒ€ν•΄ 예기치 μ•Šμ€ λ™μž‘μ„ μœ λ°œν•  수 μžˆμŠ΅λ‹ˆλ‹€.

이 λ¬Έμ œλŠ” Geolocator ν”ŒλŸ¬κ·ΈμΈ 자체둜 μΈν•œ 것이 μ•„λ‹ˆλΌκ³  μƒκ°ν•˜κΈ° λ•Œλ¬Έμ— μ§€κΈˆ 이 문제λ₯Ό λ‹«κ² μŠ΅λ‹ˆλ‹€.

blah blah 볡사 λΆ™μ—¬λ„£κΈ°λ₯Ό ν•œ μ‚¬λžŒλ“€μ„ μœ„ν•΄:

The prefix "tools" for attribute "tools:node" associated with an element type "uses-permission" is not bound.

μΆ”κ°€ν•΄μ•Ό ν•©λ‹ˆλ‹€.

    xmlns:tools="http://schemas.android.com/tools"

μƒλ‹¨μ—μ„œ λ‹€μŒκ³Ό 같이

```xml
xmlns:tools="http://schemas.android.com/tools"
νŒ¨ν‚€μ§€="com.example.your_app">
````

이 μ†”λ£¨μ…˜μ˜ 좜처:

(https://stackoverflow.com/questions/55334431/facing-below-error-toolsnode-associated-with-an-element-type-uses-permission)[https://stackoverflow.com/questions/55334431/facing- under-error-toolsnode-associated-with-an-element-type-uses-permission]

Android ν”Œλž«νΌ μžμ²΄κ°€ μ•± μ„€μΉ˜ 쀑에 ACCESS_BACKGROUND_LOCATION κΆŒν•œμ„ μ£Όμž…ν•˜λ―€λ‘œ 이 ν”ŒλŸ¬κ·ΈμΈμ˜ 결함이 아닐 수 μžˆμŠ΅λ‹ˆλ‹€. 이 λ§ν¬μ—μ„œ μžμ„Έν•œ λ‚΄μš©μ„ 읽을 수 μžˆμŠ΅λ‹ˆλ‹€. https://developer.android.com/about/versions/10/privacy/changes#app -access-device-location
μ–΄λ–€ μƒνƒœ:

앱이 Android 10 μ΄μƒμ—μ„œ μ‹€ν–‰λ˜μ§€λ§Œ Android 9(API 레벨 28) μ΄ν•˜λ₯Ό λŒ€μƒμœΌλ‘œ ν•˜λŠ” 경우 ν”Œλž«νΌμ€ λ‹€μŒ λ™μž‘μ„ μ μš©ν•©λ‹ˆλ‹€.

앱이 λ‹€μŒμ„ μ„ μ–Έν•˜λŠ” 경우ACCESS_FINE_LOCATION λ˜λŠ” ACCESS_COARSE_LOCATION μš”μ†Œμ— λŒ€ν•΄ μ‹œμŠ€ν…œμ΄ μžλ™μœΌλ‘œμ„€μΉ˜ 쀑 ACCESS_BACKGROUND_LOCATION에 λŒ€ν•œ μš”μ†Œμž…λ‹ˆλ‹€.
μ•±μ—μ„œ ACCESS_FINE_LOCATION λ˜λŠ” ACCESS_COARSE_LOCATION을 μš”μ²­ν•˜λ©΄ μ‹œμŠ€ν…œμ—μ„œ μžλ™μœΌλ‘œ ACCESS_BACKGROUND_LOCATION을 μš”μ²­μ— μΆ”κ°€ν•©λ‹ˆλ‹€.

μ €λŠ” geolocator의 곡식 예제λ₯Ό .apk(μ„œλͺ…λœ λΉŒλ“œ)둜 λΉŒλ“œν•˜κ³  ν”Œλ ˆμ΄ μŠ€ν† μ–΄μ— μ—…λ‘œλ“œν–ˆμŠ΅λ‹ˆλ‹€.

λ¬Έμ œκ°€ μžˆμŠ΅λ‹ˆλ‹€.

"λ°±κ·ΈλΌμš΄λ“œ μœ„μΉ˜ κΆŒν•œ 선언을 μ—…λ°μ΄νŠΈν•΄μ•Ό ν•©λ‹ˆλ‹€."

AndroidManifest.xml은 κΉ¨λ—ν•©λ‹ˆλ‹€. κΆŒν•œμ΄ μ„ μ–Έλ˜μ§€ μ•Šμ•˜μŠ΅λ‹ˆλ‹€.
.apk μ„ΈλΆ€ 정보(Play μŠ€ν† μ–΄ 관리 νŽ˜μ΄μ§€)에 μš”μ²­λœ κΆŒν•œμ΄ ν‘œμ‹œλ˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.

베타 채널(baseflow ν…œν”Œλ¦Ώμ—λŠ” ν•΄λ‹Ή Dart 버전이 ν•„μš”ν•˜κΈ° λ•Œλ¬Έ).

[βœ“] Flutter(Linux의 경우 채널 베타, 1.25.0-8.3.pre, λ‘œμΌ€μΌ en_US.UTF-8)
β€’ Flutter 버전 1.25.0-8.3.pre(/home/anand/flutter)
β€’ ν”„λ ˆμž„μ›Œν¬ κ°œμ •νŒ 5d36f2e7f5(11일 μ „), 2021-01-14 15:57:49 -0800
β€’ 엔진 κ°œμ •νŒ 7a8f8ca02c
β€’ Dart 버전 2.12.0(λΉŒλ“œ 2.12.0-133.7.beta)

[κ±΄λ„ˆλ›°μ—ˆλ‹€]

μΆ”μ‹ 
μ•„λ§ˆλ„ 이 문제일 수 μžˆμŠ΅λ‹ˆλ‹€(ACCESS_BACKGROUND_LOCATION κΆŒν•œμ΄ μžˆλŠ” 이전 .apk).
https://stackoverflow.com/questions/65789352/google-asks-for-location-permission-declaration-for-new-android-app-release/65849925

PPS 예, 였λ₯˜ 없이 λ‚΄λΆ€ ν…ŒμŠ€νŠΈμ— 곡식 Geolocator 예제λ₯Ό κ²Œμ‹œν•  수 μžˆμ—ˆμŠ΅λ‹ˆλ‹€. λ‹€λ₯Έ μ‚¬μš©μžκ°€ 이 사둀λ₯Ό 찾을 수 μžˆλ„λ‘ μ—¬κΈ°μ—μ„œ 이 κ²Œμ‹œλ¬Όμ„ μ‚­μ œν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€. μ•„λ§ˆλ„ μœ μš©ν•  κ²ƒμž…λ‹ˆλ‹€.

ν”ŒλŸ¬κ·ΈμΈ Geolocationμ—μ„œ λ¬Έμ œκ°€ λ°œμƒν•˜μ§€ μ•Šλ”λΌλ„ 해결책을 찾은 μ‚¬λžŒμ΄ μžˆμŠ΅λ‹ˆκΉŒ?

λ™μΌν•œ 였λ₯˜κ°€ λ°œμƒν–ˆμŠ΅λ‹ˆλ‹€. μ „κ²½ Geolocation만 μ‚¬μš©ν•˜κ³  λ§€λ‹ˆνŽ˜μŠ€νŠΈμ— ACCESS_BACKGROUND_LOCATION κΆŒν•œμ΄ μ—†μ§€λ§Œ Google Playμ—μ„œ λ‚΄ 앱을 κ±°λΆ€ν•©λ‹ˆλ‹€.

Background location access not declared
We detected that your app contains at least one feature that requests access to location in the background, 
however  your permission declaration form did not reflect this. 
Please log in to your Play Console to resubmit your location declaration form.
You may either remove location in the background from your app or indicate that the usage is in the background.

λ‹΅λ³€ κ°μ‚¬ν•©λ‹ˆλ‹€

이 νŽ˜μ΄μ§€κ°€ 도움이 λ˜μ—ˆλ‚˜μš”?
0 / 5 - 0 λ“±κΈ‰