개발환경 : VS Code
개발환경 : VS Code
Health Connect 를 열심히 로컬 환경에서 개발하고, 이제 PlayStore 내부테스트로 테스트를 시작하려는 순간!
이런 메세지를 마주하게 될 것이다.
앱이 헬스 커넥트에 엑세스할 수 없음
앱이 최신 상태인지 확인하거나 앱 개발자에게 지원을 문의하세요.
This app can't access Health Connect
Check the app is up-to-date, or contract the app developer for support.
이 때, 우리가 간과한 것이 있으니! 자주 묻는 질문(FAQ) 까지 정독하지 않은 것 즉, 제일 중요한 "개발자 선언 양식"을 작성하여 요청 해야한다는 것!!
Google Health Connect API Request 을 신청하면 일단 일주일은 소요가 되며, 대략 매주 월요일 정도에 승인 리스트가 나오는 것으로 알려져 있다.
요즘 헬스 커넥트 때문에 health-connect-support 담당자와 1일 1메일을 주고받는다.. 휴...ㅠ
빨리 승인이 되기를 😰
참고 자료
Data accessed through Health Connect Permissions is regarded as personal and sensitive user data subject to the User Data policy, and the following additional requirements:
Requests to access data through Health Connect must be clear and understandable. Health Connect may only be used in accordance with the applicable policies, terms and conditions, and for approved use cases as set forth in this policy. This means you may only request access to permissions when your application or service meets one of the approved use cases.
Approved use cases for access to Health Connect Permissions are:
Health Connect is a general purpose data storage and sharing platform that allows users to aggregate health and fitness data from various sources on their Android device and share it with third parties at their election. The data may originate from various sources as determined by the users. Developers must assess whether Health Connect is appropriate for their intended use and to investigate and vet the source and quality of any data from Health Connect in connection with any purpose, and, in particular, for research, health, or medical uses.
Upon using Health Connect for an appropriate use, your use of the data accessed through Health Connect must also comply with the below requirements. These requirements apply to the raw data obtained from Health Connect, and data aggregated, de-identified, or derived from the raw data.
All other transfers, uses, or sale of Health Connect data is prohibited, including:
Access to Health Connect may not be used in violation of this policy or other applicable Health Connect terms and conditions or policies, including for the following purposes:
An affirmative statement that your use of Health Connect data complies with Limited Use restrictions must be disclosed in your application or on a website belonging to your web-service or application; for example, a link on a homepage to a dedicated page or privacy policy noting: “The use of information received from Health Connect will adhere to the Health Connect Permissions policy, including the Limited Use requirements.”
You may only request access to permissions that are critical to implementing your application or service's functionality.
This means:
Health Connect handles health and fitness data, which includes personal and sensitive information. All applications and services must contain a privacy policy, which must comprehensively disclose how your application or service collects, uses, and shares user data. This includes the types of parties to which any user data is shared, how you use the data, how you store and secure the data, and what happens to the data when an account is deactivated and/or deleted.
In addition to the requirements under applicable law, you must also adhere to the following requirements:
You must handle all user data securely. Take reasonable and appropriate steps to protect all applications or systems that make use of Health Connect against unauthorized or unlawful access, use, destruction, loss, alteration, or disclosure.
Recommended security practices include implementing and maintaining an Information Security Management System such as outlined in ISO/IEC 27001 and ensuring your application or web service is robust and free from common security issues as set out by the OWASP Top 10.
Depending on the API being accessed and number of user grants or users, we will require that your application or service undergo a periodic security assessment and obtain a Letter of Assessment from a designated third party if your product transfers data off the user's own device.
For more information on requirements for apps connecting to Health Connect, please see this help article.
[HealthConnect] Google Code Lab (1) (0) | 2023.04.12 |
---|---|
[AOS] Health Connect - 헬스 커넥트를 통해 건강/피트니스 앱 통합을 간소화한 Signos (0) | 2023.02.22 |
[AOS] Health Connect 적용하기 - Leading Health and Fitness Apps Roll Out Health Connect Integrations (0) | 2023.02.15 |
[AOS] Health Connect 시작하기 - 11 May 2022 (0) | 2023.02.08 |
[AOS] Android SDK 플랫폼 출시 노트 - API 레벨 (0) | 2023.01.15 |
Health Connect is a health data platform for Android app developers. It provides a single, consolidated interface for access to users' health & wellness data, and consistent functional behavior across all devices. With Health Connect, users have a secure health & wellness data storage on-device, with full control and transparency over access.
Health Connect supports more than 50 common health & fitness data types and categories, including: activity, sleep, nutrition, body measurements and vitals like heart rate and blood pressure.
With user permission, developers can securely read from and write data to Health Connect, using standardized schemas and API behavior. Users will have full control over their privacy settings, with granular controls to see which apps are requesting access to data at any given time. The data in Health Connect is stored on-device and encrypted. Users will have the ability to shut off access or delete data they don't want on their device, and the option to prioritize one data source over another when using multiple apps.
The following is an explanation of Health Connect's key aspects and architectural components:
In this codelab, you're going to build a simple Health and Fitness app integrated with Health Connect. Your app will:
[Android] Health Connect ... "앱이 헬스 커넥트에 엑세스할 수 없음" (2) | 2023.04.18 |
---|---|
[AOS] Health Connect - 헬스 커넥트를 통해 건강/피트니스 앱 통합을 간소화한 Signos (0) | 2023.02.22 |
[AOS] Health Connect 적용하기 - Leading Health and Fitness Apps Roll Out Health Connect Integrations (0) | 2023.02.15 |
[AOS] Health Connect 시작하기 - 11 May 2022 (0) | 2023.02.08 |
[AOS] Android SDK 플랫폼 출시 노트 - API 레벨 (0) | 2023.01.15 |
Mobile apps with HTML, CSS & JS Target multiple platforms with one code base Free and open source
웹 베이스로 하이브리드 앱을 만들기 위한 프레임워크 중 하나로 Apache Software Foundation 에서 만들고 있다. 라이센스는 당연히 Apache License, Version 2.0.
요즘 계속 Native만 작업했는데, 오랜만에 이런 하이브리드 환경을 접하게 되었다.
잘해보자구!
[RN] react-native Async Storage (0) | 2019.06.12 |
---|---|
[RN] react-native-http-cache getMainDiskStorageCache error (0) | 2019.06.11 |
[RN] React Native device info 사용하기 (0) | 2019.05.30 |
[RN] React-Native NetInfo 사용하기 (0) | 2019.05.29 |
[RN] React Native WebView Debugging (0) | 2019.05.28 |
Signos helps people make healthier decisions and achieve their health goals by giving them a simple way to track and monitor their body’s response to glucose throughout the day. Pairing a continuous glucose monitor with an AI-driven app, Signos builds an understanding of a member's metabolic profile in real time, providing personalized nutrition suggestions based on their glucose patterns. This includes determining which foods are best for a member and when to eat them, or when to exercise to bring glucose levels back within a healthy range for optimal weight loss.
Signos integrated Health Connect so its members’ health and fitness data from apps like Fitbit, Samsung Health, and Google Fit can be automatically synced to the Signos app. Instead of requiring members to manually input this data from multiple sources, they can use Health Connect and enable Signos to sync with the other integrated apps they use to support their well-being. Not only does this save members time, it also ensures consistent and accurate data.
With Health Connect, it’s easier for Signos to identify patterns in a member's health and offer more insightful recommendations based on their glucose patterns. It also provides Signos members with a better understanding of how their daily choices affect their glucose, metabolic health, and weight by bringing their health data together in Signos, where they can easily view it and make comprehensive connections.
Before implementing Health Connect, Signos developers struggled to connect relevant data from multiple sources because many APIs weren't available or too many integrations needed to be created and maintained. This meant the Signos team had to write individual integrations to support multiple API surfaces for every app they wanted to sync data from. Now, they only need to write one, saving them a tremendous amount of development time and effort.
Currently, Health Connect’s first integration with Signos syncs personal wellness data like exercise, heart rate, sleep, and hydration. In the future, Signos plans to build out more robust integrations and in-app experiences with each data set, including women’s health, nutrition, and even mindfulness.
Signos is excited about what the future of Health Connect will bring. Health Connect helps standardize different data types and allows Android apps to freely connect to the API, so Signos won’t have to create any further integrations as other apps adopt Health Connect. This means that as the Health Connect ecosystem grows, so will Signos’ ability to help its members.
Health Connect lets developers and users securely connect with multiple Android apps and devices. Watch the DevByte introduction video to learn how you can get started with Health Connect.
[Android] Health Connect ... "앱이 헬스 커넥트에 엑세스할 수 없음" (2) | 2023.04.18 |
---|---|
[HealthConnect] Google Code Lab (1) (0) | 2023.04.12 |
[AOS] Health Connect 적용하기 - Leading Health and Fitness Apps Roll Out Health Connect Integrations (0) | 2023.02.15 |
[AOS] Health Connect 시작하기 - 11 May 2022 (0) | 2023.02.08 |
[AOS] Android SDK 플랫폼 출시 노트 - API 레벨 (0) | 2023.01.15 |
Earlier this year, we introduced Health Connect as a way for app developers like you to have early access to a platform that securely shares health and fitness data across Android devices, with user consent. We collaborated with Samsung to build this platform which simplifies the connectivity between your apps while providing centralized privacy controls for users. We are now making the Health Connect (Beta) app available for download in Google Play to give users a central place to manage their privacy settings with granular controls to see which apps have access to data at any given time.
By enabling health and fitness apps to talk to each other, each app is able to provide a user with better, more holistic health insights.
In the past, developers had to establish multiple API connections to share data between different apps and each integration was costly to build and maintain. This limited developers’ data sharing capabilities and made it hard for users to unlock this data so that it could be utilized in different apps.
Now, with Health Connect, building an integration with a new app is as simple as reading in new data from Health Connect, rather than building a whole new integration.
For example, Android users will now be able to sync and get credit for their Peloton workouts in apps like Oura, MyFitnessPal, WeightWatchers and Lifesum. Now, through a single integration with Health Connect, Peloton Members will have the option to share their workout stats across the ecosystem of apps they use to support their overall wellness.
"With Health Connect APIs, our engineers were able to easily adapt their existing architecture in order to read and write user health data such as nutrition, hydration, exercise, and steps. With this integration, we're now able to consume data from any 3rd party application that also writes to Health Connect, expanding our users' choices while allowing them more flexibility to grant granular permissions about which data they want to share"
– Jason Peterson, Chief Technology Officer of MyFitnessPal
Previously, users had to navigate to multiple apps to manage data permissions. And, developers had to build out permissions management UIs themselves.
With Health Connect, users can easily manage permissions in a single place, with granular controls to see which apps are accessing data at any given time.
For developers, Health Connect provides the permissions management hub and granular permissions UIs out of the box, so you can set this up quickly.
granular permissions screen that shows the different data types |
For example, Signos was able to quickly set up permissions checks with Health Connect. “One aspect I was pleasantly surprised by was the user onboarding UX,” said Signos developer Jake Smith. “A simple, drop-in piece of code sets up the permissions so users can start reaping the benefits.”
Join the many developers who have already integrated with Health Connect and don’t miss out on the opportunity to develop richer insights for your users. Check out our documentation, helpful video tutorials, and code samples – and start building today!
[HealthConnect] Google Code Lab (1) (0) | 2023.04.12 |
---|---|
[AOS] Health Connect - 헬스 커넥트를 통해 건강/피트니스 앱 통합을 간소화한 Signos (0) | 2023.02.22 |
[AOS] Health Connect 시작하기 - 11 May 2022 (0) | 2023.02.08 |
[AOS] Android SDK 플랫폼 출시 노트 - API 레벨 (0) | 2023.01.15 |
[Android] Android 12 - startScanner java.lang.SecurityException (0) | 2022.02.15 |
From helping you log your meals with MyFitnessPal to getting a holistic view of your health with Withings, apps and devices are a source for many kinds of useful health and fitness data. As Android developers, connecting and sharing this data between apps can help you provide more meaningful experiences and insights for your users. However, much of this information is spread across multiple experiences and different devices, making it difficult to bring together. Moreover, there are no centralized privacy controls for Android users.
This is why we’ve created Health Connect, a platform and API for Android app developers. With user permission, developers can use a single set of APIs to securely access and share health and fitness data across Android devices.
We're building this new unified platform in collaboration with Samsung to simplify connectivity between apps. We appreciate Samsung’s collaboration as we roll out Health Connect to foster richer app experiences while also providing centralized privacy controls for users.
We've been working with developers including MyFitnessPal, Leap Fitness and Withings as part of an early access program. In addition, Samsung Health, Google Fit and Fitbit are adopting Health Connect. Starting today, all developers can get access to Health Connect's common set of APIs for Android via Android Jetpack.
Health Connect fits in with Google’s wider efforts to help billions of people be healthier, using our platforms and technology to connect and bring more meaning to health information.
How Health Connect Works
Health Connect supports many common health and fitness data types and categories, including: activity, sleep, nutrition, body measurements and vitals like heart rate and blood pressure.
With user permission, developers can securely read from and write data to Health Connect, using standardized schema and API behavior. Users will have full control over their privacy settings, with granular controls to see which apps are requesting access to data at any given time. The data in Health Connect is all on-device and encrypted. Users will have the ability to shut off access or delete data they don’t want on their device, and the option to prioritize one data source over another when using multiple apps.
It’s easy to get started with Health Connect. Health Connect’s single set of APIs makes it simple to manage permissions and read and write data. Here’s an example of how you can request permissions and then write some data.
First, build a set of the permissions you plan to request read or write access to. In this example we are reading and writing steps and heart rate.
private val permissions =
setOf(
Permission.createReadPermission(Steps::class),
Permission.createWritePermission(Steps::class),
Permission.createReadPermission(HeartRate::class),
Permission.createWritePermission(HeartRate::class),
)
// then, create a permissions request for this set of permissions
Then, launch the permissions request, which will bring the user to the Health Connect permissions UI to grant permissions.
Once the user grants permission, you are ready to read and write data. Here’s an example of how to write steps data over a period of time. Include the total number of steps, start and end time, and timezone information, and then insert the data into Health Connect.
private suspend fun writeSomeData(client: HealthConnectClient) {
val records = mutableListOf<Record>()
records.add(
Steps(
count = 888,
startTime = START_TIME,
endTime = END_TIME,
startZoneOffset = null,
endZoneOffset = null,
)
)
// add additional records as needed
}
Health Connect is now available to developers:
Watch the technical session below:
https://android-developers.googleblog.com/search/label/Health%20Connect%20API
[AOS] Health Connect - 헬스 커넥트를 통해 건강/피트니스 앱 통합을 간소화한 Signos (0) | 2023.02.22 |
---|---|
[AOS] Health Connect 적용하기 - Leading Health and Fitness Apps Roll Out Health Connect Integrations (0) | 2023.02.15 |
[AOS] Android SDK 플랫폼 출시 노트 - API 레벨 (0) | 2023.01.15 |
[Android] Android 12 - startScanner java.lang.SecurityException (0) | 2022.02.15 |
[Android] 개발자 정책 변경 (6/16일까지 변경 필요) (0) | 2020.05.19 |
API 레벨 | 플랫폼 버전 | 플랫폼명 | 출시날짜 |
API 수준 33 | Android 13 | - | August 16, 2022 |
API 수준 32 | Android 12L | - | March 7, 2022 |
API 수준 31 | Android 12 | - | October 4, 2021 |
API 수준 30 | Android 11 | - | September 8, 2020 |
API 수준 29 | Android 10 | - | September 3, 2019 |
API 수준 28 | Android 9 | Pie | August 6, 2018 |
API 수준 27 | Android 8.1 | ||
API 수준 26 | Android 8.0 | Oreo | August 21, 2017 |
API 수준 25 | Android 7.1 | ||
API 수준 24 | Android 7.0 | Nougat | August 22, 2016 |
API 수준 23 | Android 6.0 | Marshmallow | October 2, 2015 |
API 수준 22 | Android 5.1 | ||
API 수준 21 | Android 5.0 | Lollipop | November 4, 2014 |
API 수준 20 | Android 4.4W | KitKat, with wearable extensions | June 25, 2014 |
API 수준 19 | Android 4.4 | KitKat | October 31, 2013 |
API 수준 18 | Android 4.3 | ||
API 수준 17 | Android 4.2 | ||
API 수준 16 | Android 4.1 | Jelly Bean | July 9, 2012 |
API 수준 15 | Android 4.0.3 | ||
API 수준 14 | Android 4.0 | Ice Cream Sandwich | October 18, 2011 |
API 수준 13 | Android 3.2 | ||
API 수준 12 | Android 3.1 | ||
API 수준 11 | Android 3.0 | Honeycomb | February 22, 2011 |
API 수준 10 | Android 2.3.3 | ||
API 수준 9 | Android 2.3 | Gingerbread | December 6, 2010 |
[AOS] Health Connect 적용하기 - Leading Health and Fitness Apps Roll Out Health Connect Integrations (0) | 2023.02.15 |
---|---|
[AOS] Health Connect 시작하기 - 11 May 2022 (0) | 2023.02.08 |
[Android] Android 12 - startScanner java.lang.SecurityException (0) | 2022.02.15 |
[Android] 개발자 정책 변경 (6/16일까지 변경 필요) (0) | 2020.05.19 |
[Android] DisplayMetrics (0) | 2020.05.14 |
### 이슈
java.lang.SecurityException: Need android.permission.BLUETOOTH_SCAN permission for AttributionSource
{ uid = 10965, packageName = ### , attributionTag = null, token = android.os.BinderProxy@b85f7e3, next = null }:
GattService registerScanner
### 해결방안
> 안드로이드 12 적용하면서 Android 12에서는 BLUETOOTH_SCAN, BLUETOOTH_ADVERTISE, BLUETOOTH_CONNECT 권한을 도입합니다. 이를 통해 앱이 위치 정보 액세스 권한을 요청하지 않고도 근처 기기를 검색할 수 있습니다. 이러한 권한을 선언하려면 앱이 Android 12를 타겟팅해야 한다.
1. manifest 적용
<manifest>
<!-- Request legacy Bluetooth permissions on older devices. -->
<uses-permission android:name="android.permission.BLUETOOTH"
android:maxSdkVersion="30" />
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN"
android:maxSdkVersion="30" />
<!-- Needed only if your app looks for Bluetooth devices.
You must add an attribute to this permission, or declare the
ACCESS_FINE_LOCATION permission, depending on the results when you
check location usage in your app. -->
<uses-permission android:name="android.permission.BLUETOOTH_SCAN" />
<!-- Needed only if your app makes the device discoverable to Bluetooth
devices. -->
<uses-permission android:name="android.permission.BLUETOOTH_ADVERTISE" />
<!-- Needed only if your app communicates with already-paired Bluetooth
devices. -->
<uses-permission android:name="android.permission.BLUETOOTH_CONNECT" />
...
</manifest>
2. 블루투스 사용 권한 요청 시 requestPermission 요청
if (PermissionType.BLUETOOTH == type ) {
permissions.add(Manifest.permission.ACCESS_COARSE_LOCATION);
permissions.add(Manifest.permission.ACCESS_FINE_LOCATION);
permissions.add(Manifest.permission.BLUETOOTH);
permissions.add(Manifest.permission.BLUETOOTH_ADMIN);
permissions.add(Manifest.permission.BLUETOOTH_SCAN);
permissions.add(Manifest.permission.BLUETOOTH_ADVERTISE);
permissions.add(Manifest.permission.BLUETOOTH_CONNECT);
}
https://developer.android.com/about/versions/12/features/bluetooth-permissions?hl=ko
[AOS] Health Connect 시작하기 - 11 May 2022 (0) | 2023.02.08 |
---|---|
[AOS] Android SDK 플랫폼 출시 노트 - API 레벨 (0) | 2023.01.15 |
[Android] 개발자 정책 변경 (6/16일까지 변경 필요) (0) | 2020.05.19 |
[Android] DisplayMetrics (0) | 2020.05.14 |
[Android] Launching 'app' on Unknown Device. (0) | 2019.10.23 |
Starting January 28, 2021, the digital certificates you use to sign your software for installation on Apple devices, submit apps to the App Store, and connect to certain Apple services will be issued from the new intermediate Apple Worldwide Developer Relations certificate that expires on February 20, 2030. Learn how to prepare for the new intermediate certificate.
Using the new certificate with Xcode
If you’re running Xcode 11.4.1 or later, you’ll receive the updated certificate automatically when you sign an app after January 28, 2021. If you’re running an earlier release of Xcode and need to generate new certificates, download and install the new intermediate certificate and utilize the command line to sign your app. You can also archive your build with your existing Xcode version and sign it for distribution with Xcode 11.4.1 or later.
Why is the Apple Worldwide Developer Relations Certification Authority being updated now if the current version doesn’t expire until 2023?
Certificates cannot be issued with a validity period that extends past the intermediate certificate’s expiration date. Updating the intermediate certificate allows developers to obtain certificates before expiration that last for the expected duration, and provides ample time to prepare for the expiration of the existing intermediate certificate.
Do I need to regenerate any of my certificates?
No. Your existing certificates will continue to function until expiration or revocation, whichever comes first.
Will customers be affected by the certificate renewal?
No. Customers who have installed apps from the App Store or Safari Extensions will not be affected by the certificate renewal.
Will my apps in development continue working?
Yes. The development versions of your apps will continue to run until the provisioning profile used to compile them expires or you revoke your signing certificate.
Will my in-house enterprise apps continue working?
Yes. All in-house enterprise apps for iOS, iPadOS, tvOS, or watchOS that you’ve deployed will continue to run as expected until the provisioning profile used to compile them expires or you revoke your signing certificate. The iOS Distribution Certificate for the Apple Developer Enterprise Program was updated on September 1, 2020. iOS Distribution Certificates generated as part of the Apple Developer Enterprise Program between February 7 and September 1, 2020, will expire on February 7, 2023. Rotate the certificate before expiration to ensure your apps are installed and signed with an active certificate.
Should I keep both intermediate certificates installed?
Yes. The intermediate certificate that expires on February 7, 2023, will continue to issue select Apple services certificates, including Apple Push Notification service (APNs) SSL certificates and Apple Wallet pass signing certificates, so you should keep both versions installed on your development systems and servers. See the complete list and timeline of certificate changes below.
In what cases should I continue using the certificate that expires in 2023?
Continue using the existing Apple Worldwide Developer Relations Intermediate Certificate (expiring in 2023) if you use any of the certificates signed with it that are listed below. These services will be updated with a new intermediate certificate (expiring in 2030) by the the end of 2021. Keep both versions installed on your development systems and servers until later this year.
Is Developer ID signed software affected?
No. Developer ID signing certificates are associated with a different intermediate certificate and aren’t affected by this renewal.
These certificates will be issued with the new intermediate certificate (expiring in 2030).
September 1, 2020
iOS Distribution for Enterprise Developer Program memberships
January 28, 2021
Updated by end of 2021
No changes
These certificates are not associated with the Apple Worldwide Developer Intermediate Certificate and are not affected by this change.
[iOS] TestFlight 업로드 할 때, 수출 규정 관련 문서가 누락됨 경고 (2) | 2020.07.22 |
---|---|
[SWIFT] UIModalPresentationStyle Example (0) | 2020.05.21 |
[iOS] iphond Sound id (0) | 2020.05.06 |
[iOS] TestFlight 푸시 알림 동작 안함 (0) | 2019.09.05 |
[iOS] no such module 'alamofire' (0) | 2019.08.06 |
보통 "아니요"를 눌러서 바로 TestFlight에 등록하지만, code 상에서 미리 넣어 둘 수 있다.
Info.plist
<key>ITSAppUsesNonExemptEncryption</key><false/>
help.apple.com/xcode/mac/current/#/dev0dc15d044
[NEWS] Apple Worldwide Developer Relations Intermediate Certificate updates (0) | 2021.01.27 |
---|---|
[SWIFT] UIModalPresentationStyle Example (0) | 2020.05.21 |
[iOS] iphond Sound id (0) | 2020.05.06 |
[iOS] TestFlight 푸시 알림 동작 안함 (0) | 2019.09.05 |
[iOS] no such module 'alamofire' (0) | 2019.08.06 |
https://developer.apple.com/documentation/uikit/uimodalpresentationstyle
[NEWS] Apple Worldwide Developer Relations Intermediate Certificate updates (0) | 2021.01.27 |
---|---|
[iOS] TestFlight 업로드 할 때, 수출 규정 관련 문서가 누락됨 경고 (2) | 2020.07.22 |
[iOS] iphond Sound id (0) | 2020.05.06 |
[iOS] TestFlight 푸시 알림 동작 안함 (0) | 2019.09.05 |
[iOS] no such module 'alamofire' (0) | 2019.08.06 |
2020년 4월 16일 이후에 게시되는 신규 앱 또는 업데이트에는 모두 최신 버전의 개발자 프로그램 정책이 바로 적용됩니다. 2020년 4월 16일 자로 Google Play에 게재된 앱은 이 날짜로부터 60일 이내에 정책을 준수해야 합니다.
개발자는 앱 내에서 제공하는 정기 결제 서비스나 콘텐츠에 관해 사용자를 오도해서는 안 됩니다. 모든 인앱 프로모션 또는 스플래시 화면에서 명확한 정보를 전달하는 것이 중요합니다.
앱 내에서는 혜택에 관해 투명하게 설명해야 합니다. 여기에는 정기 결제 가격, 결제 주기 빈도, 앱을 사용하려면 정기 결제가 필요한지 등 혜택의 조건을 명확하게 설명하는 것이 포함됩니다. 사용자가 추가적인 조치를 취하지 않아도 이러한 정보를 검토할 수 있어야 합니다.
다음은 자주 발생하는 위반 사례입니다.
① 닫기 버튼이 명확하게 보이지 않으며 사용자가 정기 결제 혜택을 수락하지 않아도 기능에 액세스할 수 있다는 사실을 이해할 수 없습니다.
② 혜택에 월별 가격만 표시되어 있어 사용자가 정기 결제를 신청할 때 6개월 가격이 청구된다는 사실을 이해할 수 없습니다.
③ 혜택에 신규 할인 가격만 표시되어 있어 신규 할인 기간이 종료된 후 어떤 가격이 자동으로 청구되는지 사용자가 이해할 수 없습니다.
④ 혜택은 사용자가 혜택의 전체 내용을 이해할 수 있도록 이용약관과 동일한 언어로 현지화되어 있어야 합니다.
사용자가 정기 결제에 등록하기 전: 기간, 가격, 사용 가능한 콘텐츠 또는 서비스 설명 등 제안의 조건을 명확하고 정확하게 설명해야 합니다. 무료 체험판이 유료 정기 결제로 전환되는 시점과 방식, 유료 정기 결제의 가격, 유료 정기 결제로 전환하고 싶지 않은 경우 정기 결제를 취소할 수 있음을 사용자에게 알려야 합니다.
다음은 자주 발생하는 위반 사례입니다.
① 닫기 버튼이 명확하게 보이지 않아서 사용자가 무료 체험판에 가입하지 않아도 기능에 액세스할 수 있다는 사실을 알 수 없습니다.
② 제안에서 무료 체험판임을 강조해서 사용자는 체험 기간이 종료되면 자동으로 요금이 청구된다는 사실을 알 수 없습니다.
③ 제안에 체험 기간이 명시되어 있지 않아서 사용자가 정기 결제 콘텐츠에 언제까지 무료로 액세스할 수 있는지 알 수 없습니다.
④ 제안은 사용자가 제안의 전체 내용을 이해할 수 있도록 이용약관과 동일한 언어로 현지화되어 있어야 합니다.
개발자는 사용자가 정기 결제를 관리 또는 취소하는 방법이 앱에 명확하게 설명되어 있는지 확인해야 합니다.
Google Play 정책에 따르면 사용자가 Google Play의 앱에서 신청한 정기 결제를 취소할 경우 현재 결제 기간에 해당하는 요금을 환불받을 수 없지만, 취소일과 관계없이 현재 결제 기간에서 남은 기간 동안 정기 결제 콘텐츠를 계속해서 이용할 수 있습니다. 사용자의 정기 결제 취소는 현재 결제 기간이 지난 이후 적용됩니다.
개발자는 콘텐츠 또는 액세스 권한 제공자로서 사용자에게 더 유리한 환불 정책을 직접 적용할 수 있습니다. 사용자에게 정기 결제, 취소, 환불 정책의 변경사항을 알리고 정책이 관련 법규를 준수하도록 할 의무는 개발자에게 있습니다.
play.google.com/about/monetization-ads/subscriptions/
[AOS] Android SDK 플랫폼 출시 노트 - API 레벨 (0) | 2023.01.15 |
---|---|
[Android] Android 12 - startScanner java.lang.SecurityException (0) | 2022.02.15 |
[Android] DisplayMetrics (0) | 2020.05.14 |
[Android] Launching 'app' on Unknown Device. (0) | 2019.10.23 |
[Android] 구글이 알려주는 정기 결제 (Subscription 101) (0) | 2019.10.13 |
DisplayMetrics DisplayMetrics 구조체에서 디스플레이에 대한 정보를 얻을 수 있다.
Android는 직접 픽셀 매핑을 사용하지 않지만 소수의 Density Independent Pixel 값을 사용하여 실제 화면 크기에 맞게 조정한다.
DisplayMetrics metrics = getResources().getDisplayMetrics();
int density = metrics.densityDpi
// DENSITY_xxx 상수 (120, 160, 213, 240, 320, 480 또는 640 dpi) 중 하나
** 실제lcd 픽셀 밀도가 필요한 경우
수평 및 수직 밀도 각각에 대해 metrics.xdpi 및 metrics.ydpi 속성에서 가져올 수 있다.
DisplayMetrics dm = new DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(dm);
// will either be DENSITY_LOW, DENSITY_MEDIUM or DENSITY_HIGH
int dpiClassification = dm.densityDpi;
// these will return the actual dpi horizontally and vertically
float xDpi = dm.xdpi;
float yDpi = dm.ydpi;
//방법 2 상수
getResources().getDisplayMetrics().density;
/*
0.75 - ldpi
1.0 - mdpi
1.5 - hdpi
2.0 - xhdpi
3.0 - xxhdpi
4.0 - xxxhdpi
*/
// 4이전의 API 수준을 대상으로 지정하는 경우 : metrics.density = 참조밀도(160dpi)의 소수점 배율 인수
int densityDpi = (int)(metrics.density * 160f);
int densityDpi = getResources().getDisplayMetrics().densityDpi;
switch (densityDpi)
{
case DisplayMetrics.DENSITY_LOW:
// LDPI : density == 0.75f
break;
case DisplayMetrics.DENSITY_MEDIUM:
// MDPI : density >= 1.0f && density < 1.5f
break;
case DisplayMetrics.DENSITY_TV:
case DisplayMetrics.DENSITY_HIGH:
// HDPI : density == 1.5f
break;
case DisplayMetrics.DENSITY_XHIGH:
case DisplayMetrics.DENSITY_280:
// XHDPI : density > 1.5f && density <= 2.0f
break;
case DisplayMetrics.DENSITY_XXHIGH:
case DisplayMetrics.DENSITY_360:
case DisplayMetrics.DENSITY_400:
case DisplayMetrics.DENSITY_420:
// XXHDPI : density > 2.0f && density <= 3.0f
break;
case DisplayMetrics.DENSITY_XXXHIGH:
case DisplayMetrics.DENSITY_560:
// XXXHDPI : density > 4.0f
break;
}
int | DENSITY_140
Intermediate density for screens that sit between DENSITY_LOW (120dpi) and DENSITY_MEDIUM (160dpi). |
int | DENSITY_180
Intermediate density for screens that sit between DENSITY_MEDIUM (160dpi) and DENSITY_HIGH (240dpi). |
int | DENSITY_200
Intermediate density for screens that sit between DENSITY_MEDIUM (160dpi) and DENSITY_HIGH (240dpi). |
int | DENSITY_220
Intermediate density for screens that sit between DENSITY_MEDIUM (160dpi) and DENSITY_HIGH (240dpi). |
int | DENSITY_260
Intermediate density for screens that sit between DENSITY_HIGH (240dpi) and DENSITY_XHIGH (320dpi). |
int | DENSITY_280
Intermediate density for screens that sit between DENSITY_HIGH (240dpi) and DENSITY_XHIGH (320dpi). |
int | DENSITY_300
Intermediate density for screens that sit between DENSITY_HIGH (240dpi) and DENSITY_XHIGH (320dpi). |
int | DENSITY_340
Intermediate density for screens that sit somewhere between DENSITY_XHIGH (320 dpi) and DENSITY_XXHIGH (480 dpi). |
int | DENSITY_360
Intermediate density for screens that sit somewhere between DENSITY_XHIGH (320 dpi) and DENSITY_XXHIGH (480 dpi). |
int | DENSITY_400
Intermediate density for screens that sit somewhere between DENSITY_XHIGH (320 dpi) and DENSITY_XXHIGH (480 dpi). |
int | DENSITY_420
Intermediate density for screens that sit somewhere between DENSITY_XHIGH (320 dpi) and DENSITY_XXHIGH (480 dpi). |
int | DENSITY_440
Intermediate density for screens that sit somewhere between DENSITY_XHIGH (320 dpi) and DENSITY_XXHIGH (480 dpi). |
int | DENSITY_450
Intermediate density for screens that sit somewhere between DENSITY_XHIGH (320 dpi) and DENSITY_XXHIGH (480 dpi). |
int | DENSITY_560
Intermediate density for screens that sit somewhere between DENSITY_XXHIGH (480 dpi) and DENSITY_XXXHIGH (640 dpi). |
int | DENSITY_600
Intermediate density for screens that sit somewhere between DENSITY_XXHIGH (480 dpi) and DENSITY_XXXHIGH (640 dpi). |
int | DENSITY_DEFAULT
The reference density used throughout the system. |
int | DENSITY_HIGH
Standard quantized DPI for high-density screens. |
int | DENSITY_LOW
Standard quantized DPI for low-density screens. |
int | DENSITY_MEDIUM
Standard quantized DPI for medium-density screens. |
int | DENSITY_TV
This is a secondary density, added for some common screen configurations. |
int | DENSITY_XHIGH
Standard quantized DPI for extra-high-density screens. |
int | DENSITY_XXHIGH
Standard quantized DPI for extra-extra-high-density screens. |
int | DENSITY_XXXHIGH
Standard quantized DPI for extra-extra-extra-high-density screens. |
Fields
public static final int | DENSITY_DEVICE_STABLE
The device's stable density. |
public float | density
The logical density of the display. |
public int | densityDpi
The screen density expressed as dots-per-inch. |
public int | heightPixels
The absolute height of the available display size in pixels. |
public float | scaledDensity
A scaling factor for fonts displayed on the display. |
public int | widthPixels
The absolute width of the available display size in pixels. |
public float | xdpi
The exact physical pixels per inch of the screen in the X dimension. |
public float | ydpi
The exact physical pixels per inch of the screen in the Y dimension. |
Public constructors
DisplayMetrics() |
Public methods
boolean | equals(Object o)
Indicates whether some other object is "equal to" this one. |
boolean | equals(DisplayMetrics other)
Returns true if these display metrics equal the other display metrics. |
int | hashCode()
Returns a hash code value for the object. |
void | setTo(DisplayMetrics o) |
void | setToDefaults() |
String | toString()
Returns a string representation of the object. |
[Android] Android 12 - startScanner java.lang.SecurityException (0) | 2022.02.15 |
---|---|
[Android] 개발자 정책 변경 (6/16일까지 변경 필요) (0) | 2020.05.19 |
[Android] Launching 'app' on Unknown Device. (0) | 2019.10.23 |
[Android] 구글이 알려주는 정기 결제 (Subscription 101) (0) | 2019.10.13 |
[Android] 앱을 Play Console에 업로드 - .aab 파일 (0) | 2019.10.10 |
There are some predefined system sounds, for the system sound ID in the range 1000 to 2000 (decimal), as shown below (from 2.0 to 5.0 beta). The system sounds are all stored in /System/Library/Audio/UISounds/.
Sound ID | File name (iPhone) | File name (iPod Touch) | Category | Note |
1000 | new-mail.caf | new-mail.caf | MailReceived | |
1001 | mail-sent.caf | mail-sent.caf | MailSent | |
1002 | Voicemail.caf | Voicemail.caf | VoicemailReceived | |
1003 | ReceivedMessage.caf | ReceivedMessage.caf | SMSReceived | |
1004 | SentMessage.caf | SentMessage.caf | SMSSent | |
1005 | alarm.caf | sq_alarm.caf | CalendarAlert | |
1006 | low_power.caf | low_power.caf | LowPower | |
1007 | sms-received1.caf | sms-received1.caf | SMSReceived_Alert | |
1008 | sms-received2.caf | sms-received2.caf | SMSReceived_Alert | |
1009 | sms-received3.caf | sms-received3.caf | SMSReceived_Alert | |
1010 | sms-received4.caf | sms-received4.caf | SMSReceived_Alert | |
1011 | - | - | SMSReceived_Vibrate | |
1012 | sms-received1.caf | sms-received1.caf | SMSReceived_Alert | |
1013 | sms-received5.caf | sms-received5.caf | SMSReceived_Alert | |
1014 | sms-received6.caf | sms-received6.caf | SMSReceived_Alert | |
1015 | Voicemail.caf | Voicemail.caf | - | Available since 2.1 |
1016 | tweet_sent.caf | tweet_sent.caf | SMSSent | Available since 5.0 |
1020 | Anticipate.caf | Anticipate.caf | SMSReceived_Alert | Available since 4.2 |
1021 | Bloom.caf | Bloom.caf | SMSReceived_Alert | Available since 4.2 |
1022 | Calypso.caf | Calypso.caf | SMSReceived_Alert | Available since 4.2 |
1023 | Choo_Choo.caf | Choo_Choo.caf | SMSReceived_Alert | Available since 4.2 |
1024 | Descent.caf | Descent.caf | SMSReceived_Alert | Available since 4.2 |
1025 | Fanfare.caf | Fanfare.caf | SMSReceived_Alert | Available since 4.2 |
1026 | Ladder.caf | Ladder.caf | SMSReceived_Alert | Available since 4.2 |
1027 | Minuet.caf | Minuet.caf | SMSReceived_Alert | Available since 4.2 |
1028 | News_Flash.caf | News_Flash.caf | SMSReceived_Alert | Available since 4.2 |
1029 | Noir.caf | Noir.caf | SMSReceived_Alert | Available since 4.2 |
1030 | Sherwood_Forest.caf | Sherwood_Forest.caf | SMSReceived_Alert | Available since 4.2 |
1031 | Spell.caf | Spell.caf | SMSReceived_Alert | Available since 4.2 |
1032 | Suspense.caf | Suspense.caf | SMSReceived_Alert | Available since 4.2 |
1033 | Telegraph.caf | Telegraph.caf | SMSReceived_Alert | Available since 4.2 |
1034 | Tiptoes.caf | Tiptoes.caf | SMSReceived_Alert | Available since 4.2 |
1035 | Typewriters.caf | Typewriters.caf | SMSReceived_Alert | Available since 4.2 |
1036 | Update.caf | Update.caf | SMSReceived_Alert | Available since 4.2 |
1050 | ussd.caf | ussd.caf | USSDAlert | |
1051 | SIMToolkitCallDropped.caf | SIMToolkitCallDropped.caf | SIMToolkitTone | |
1052 | SIMToolkitGeneralBeep.caf | SIMToolkitGeneralBeep.caf | SIMToolkitTone | |
1053 | SIMToolkitNegativeACK.caf | SIMToolkitNegativeACK.caf | SIMToolkitTone | |
1054 | SIMToolkitPositiveACK.caf | SIMToolkitPositiveACK.caf | SIMToolkitTone | |
1055 | SIMToolkitSMS.caf | SIMToolkitSMS.caf | SIMToolkitTone | |
1057 | Tink.caf | Tink.caf | PINKeyPressed | |
1070 | ct-busy.caf | ct-busy.caf | AudioToneBusy | There was no category for this sound before 4.0. |
1071 | ct-congestion.caf | ct-congestion.caf | AudioToneCongestion | There was no category for this sound before 4.0. |
1072 | ct-path-ack.caf | ct-path-ack.caf | AudioTonePathAcknowledge | There was no category for this sound before 4.0. |
1073 | ct-error.caf | ct-error.caf | AudioToneError | There was no category for this sound before 4.0. |
1074 | ct-call-waiting.caf | ct-call-waiting.caf | AudioToneCallWaiting | There was no category for this sound before 4.0. |
1075 | ct-keytone2.caf | ct-keytone2.caf | AudioToneKey2 | There was no category for this sound before 4.0. |
1100 | lock.caf | sq_lock.caf | ScreenLocked | |
1101 | unlock.caf | sq_lock.caf | ScreenUnlocked | |
1102 | - | - | FailedUnlock | |
1103 | Tink.caf | sq_tock.caf | KeyPressed | |
1104 | Tock.caf | sq_tock.caf | KeyPressed | |
1105 | Tock.caf | sq_tock.caf | KeyPressed | |
1106 | beep-beep.caf | sq_beep-beep.caf | ConnectedToPower | |
1107 | RingerChanged.caf | RingerChanged.caf | RingerSwitchIndication | |
1108 | photoShutter.caf | photoShutter.caf | CameraShutter | |
1109 | shake.caf | shake.caf | ShakeToShuffle | Available since 3.0 |
1110 | jbl_begin.caf | jbl_begin.caf | JBL_Begin | Available since 3.0 |
1111 | jbl_confirm.caf | jbl_confirm.caf | JBL_Confirm | Available since 3.0 |
1112 | jbl_cancel.caf | jbl_cancel.caf | JBL_Cancel | Available since 3.0 |
1113 | begin_record.caf | begin_record.caf | BeginRecording | Available since 3.0 |
1114 | end_record.caf | end_record.caf | EndRecording | Available since 3.0 |
1115 | jbl_ambiguous.caf | jbl_ambiguous.caf | JBL_Ambiguous | Available since 3.0 |
1116 | jbl_no_match.caf | jbl_no_match.caf | JBL_NoMatch | Available since 3.0 |
1117 | begin_video_record.caf | begin_video_record.caf | BeginVideoRecording | Available since 3.0 |
1118 | end_video_record.caf | end_video_record.caf | EndVideoRecording | Available since 3.0 |
1150 | vc~invitation-accepted.caf | vc~invitation-accepted.caf | VCInvitationAccepted | Available since 4.0 |
1151 | vc~ringing.caf | vc~ringing.caf | VCRinging | Available since 4.0 |
1152 | vc~ended.caf | vc~ended.caf | VCEnded | Available since 4.0 |
1153 | ct-call-waiting.caf | ct-call-waiting.caf | VCCallWaiting | Available since 4.1 |
1154 | vc~ringing.caf | vc~ringing.caf | VCCallUpgrade | Available since 4.1 |
1200 | dtmf-0.caf | dtmf-0.caf | TouchTone | |
1201 | dtmf-1.caf | dtmf-1.caf | TouchTone | |
1202 | dtmf-2.caf | dtmf-2.caf | TouchTone | |
1203 | dtmf-3.caf | dtmf-3.caf | TouchTone | |
1204 | dtmf-4.caf | dtmf-4.caf | TouchTone | |
1205 | dtmf-5.caf | dtmf-5.caf | TouchTone | |
1206 | dtmf-6.caf | dtmf-6.caf | TouchTone | |
1207 | dtmf-7.caf | dtmf-7.caf | TouchTone | |
1208 | dtmf-8.caf | dtmf-8.caf | TouchTone | |
1209 | dtmf-9.caf | dtmf-9.caf | TouchTone | |
1210 | dtmf-star.caf | dtmf-star.caf | TouchTone | |
1211 | dtmf-pound.caf | dtmf-pound.caf | TouchTone | |
1254 | long_low_short_high.caf | long_low_short_high.caf | Headset_StartCall | |
1255 | short_double_high.caf | short_double_high.caf | Headset_Redial | |
1256 | short_low_high.caf | short_low_high.caf | Headset_AnswerCall | |
1257 | short_double_low.caf | short_double_low.caf | Headset_EndCall | |
1258 | short_double_low.caf | short_double_low.caf | Headset_CallWaitingActions | |
1259 | middle_9_short_double_low.caf | middle_9_short_double_low.caf | Headset_TransitionEnd | |
1300 | Voicemail.caf | Voicemail.caf | SystemSoundPreview | |
1301 | ReceivedMessage.caf | ReceivedMessage.caf | SystemSoundPreview | |
1302 | new-mail.caf | new-mail.caf | SystemSoundPreview | |
1303 | mail-sent.caf | mail-sent.caf | SystemSoundPreview | |
1304 | alarm.caf | sq_alarm.caf | SystemSoundPreview | |
1305 | lock.caf | sq_lock.caf | SystemSoundPreview | |
1306 | Tock.caf | sq_tock.caf | KeyPressClickPreview | The category was SystemSoundPreview before 3.2. |
1307 | sms-received1.caf | sms-received1.caf | SMSReceived_Selection | |
1308 | sms-received2.caf | sms-received2.caf | SMSReceived_Selection | |
1309 | sms-received3.caf | sms-received3.caf | SMSReceived_Selection | |
1310 | sms-received4.caf | sms-received4.caf | SMSReceived_Selection | |
1311 | - | - | SMSReceived_Vibrate | |
1312 | sms-received1.caf | sms-received1.caf | SMSReceived_Selection | |
1313 | sms-received5.caf | sms-received5.caf | SMSReceived_Selection | |
1314 | sms-received6.caf | sms-received6.caf | SMSReceived_Selection | |
1315 | Voicemail.caf | Voicemail.caf | SystemSoundPreview | Available since 2.1 |
1320 | Anticipate.caf | Anticipate.caf | SMSReceived_Selection | Available since 4.2 |
1321 | Bloom.caf | Bloom.caf | SMSReceived_Selection | Available since 4.2 |
1322 | Calypso.caf | Calypso.caf | SMSReceived_Selection | Available since 4.2 |
1323 | Choo_Choo.caf | Choo_Choo.caf | SMSReceived_Selection | Available since 4.2 |
1324 | Descent.caf | Descent.caf | SMSReceived_Selection | Available since 4.2 |
1325 | Fanfare.caf | Fanfare.caf | SMSReceived_Selection | Available since 4.2 |
1326 | Ladder.caf | Ladder.caf | SMSReceived_Selection | Available since 4.2 |
1327 | Minuet.caf | Minuet.caf | SMSReceived_Selection | Available since 4.2 |
1328 | News_Flash.caf | News_Flash.caf | SMSReceived_Selection | Available since 4.2 |
1329 | Noir.caf | Noir.caf | SMSReceived_Selection | Available since 4.2 |
1330 | Sherwood_Forest.caf | Sherwood_Forest.caf | SMSReceived_Selection | Available since 4.2 |
1331 | Spell.caf | Spell.caf | SMSReceived_Selection | Available since 4.2 |
1332 | Suspense.caf | Suspense.caf | SMSReceived_Selection | Available since 4.2 |
1333 | Telegraph.caf | Telegraph.caf | SMSReceived_Selection | Available since 4.2 |
1334 | Tiptoes.caf | Tiptoes.caf | SMSReceived_Selection | Available since 4.2 |
1335 | Typewriters.caf | Typewriters.caf | SMSReceived_Selection | Available since 4.2 |
1336 | Update.caf | Update.caf | SMSReceived_Selection | Available since 4.2 |
1350 | - | - | RingerVibeChanged | |
1351 | - | - | SilentVibeChanged | |
4095 | - | - | Vibrate | There was no category for this sound before 2.2. In the SDK this is the constant kSystemSoundID_Vibrate. |
http://iphonedevwiki.net/index.php/AudioServices
http://onj3.andrelouis.com/phonetones/unzipped/Apple-iOS10/System/Library/Audio/UISounds/New/
[iOS] TestFlight 업로드 할 때, 수출 규정 관련 문서가 누락됨 경고 (2) | 2020.07.22 |
---|---|
[SWIFT] UIModalPresentationStyle Example (0) | 2020.05.21 |
[iOS] TestFlight 푸시 알림 동작 안함 (0) | 2019.09.05 |
[iOS] no such module 'alamofire' (0) | 2019.08.06 |
The file “Pods-_DEV.debug.xcconfig” couldn't be opened because there is no such file. (0) | 2019.08.06 |