반응형

GitHub에서 포크한 저장소를 삭제하는 방법은 다음과 같다:

  1. GitHub에 로그인: GitHub 계정으로 로그인한다.
  2. 저장소 페이지로 이동: 삭제하려는 포크된 저장소 페이지로 이동한다.
  3. Settings (설정) 메뉴로 이동:
    • 저장소의 상단 메뉴에서 Settings 탭을 클릭한다.
  4. 저장소 삭제 옵션으로 이동:
    • Settings 페이지의 하단으로 스크롤하여 Danger Zone 섹션에서 Delete this repository 버튼을 클릭한다.
  5. 확인 및 삭제:
    • 나타나는 팝업 창에 저장소 이름을 정확히 입력한 후, 삭제 확인을 위해 다시 한 번 I understand the consequences, delete this repository 버튼을 클릭한다.

이 과정을 완료하면 포크한 저장소가 삭제된다. 

만약 포크한 저장소가 너무 많아서 일일이 삭제하기 어려운 경우, GitHub CLI를 사용하면 쉽게 일괄 삭제할 수 있다.

  1. GitHub CLI 설치: GitHub CLI가 설치되어 있지 않다면 GitHubCLI설치가이드에 따라 설치한다.
  2. GitHub 로그인:명령어를 입력하고, 지시에 따라 GitHub 계정으로 로그인한다.
    gh auth login
  3. 포크된 저장소 리스트 확인: 모든 포크된 저장소를 확인하려면 다음 명령어를 사용한다.
    gh repo list YOUR_USERNAME --fork --json name
  4. 포크된 저장소 일괄 삭제: 특정 조건을 만족하는 포크만 삭제하려면, 스크립트를 이용해 필터링하여 삭제할 수 있다. 아래는 모든 포크된 저장소를 삭제하는 예제이다.  주의: 이 스크립트는 본인 계정의 모든 포크된 저장소를 반복적으로 삭제한다.
    gh repo list YOUR_USERNAME --fork --json name -q '.[].name' | while read repo; do gh repo delete YOUR_USERNAME/$repo --confirm done

 

다른 방법으로 GitHub 개발자 설정에서 토큰을 발급 받은 후 아래와 같이 python 코드를 사용하여 삭제도 가능하다.

import requests
import time

# GitHub 개인 액세스 토큰과 사용자 이름
TOKEN = 'github_pat_11ABHO ... Q5L5R6ly7vhP'
USERNAME = 'YOUR USERNAME'

# GitHub API URL 설정
API_URL = f'https://api.github.com/users/{USERNAME}/repos'

# 요청 헤더 설정
headers = {
    'Authorization': f'token {TOKEN}'
}

# 저장소 목록 가져오기
response = requests.get(API_URL, headers=headers)

# 응답 상태 코드 확인
if response.status_code != 200:
    print(f"API 요청 실패: {response.status_code}, {response.text}")
else:
    repos = response.json()

    # 포크된 저장소만 필터링하여 삭제
    for repo in repos:
        if isinstance(repo, dict) and repo.get('fork') and repo.get('owner', {}).get('login') == USERNAME:
            repo_name = repo['name']
            delete_url = f'https://api.github.com/repos/{USERNAME}/{repo_name}'
            delete_response = requests.delete(delete_url, headers=headers)

            if delete_response.status_code == 204:
                print(f'{repo_name} 삭제 완료')
            else:
                print(f'{repo_name} 삭제 실패: {delete_response.status_code}, {delete_response.text}')
            
    print("모든 포크된 저장소 삭제 작업이 완료되었습니다.")

위 코드 실행시 약 25개정도 삭제될때마다 API 요청이 거절된다. 이유는 GitHub API는 짧은 시간에 많은 요청이 들어오면 요청을 제한하거나 차단한다. 요청시 일정 시간 딜레이를 주거나 여러번 실행하여 해결할 수 있다.

 

 

반응형
블로그 이미지

SKY STORY

,
반응형

.gitignore에 my_ignore_folder/ 폴더를 추가했음에도 Git이 계속 해당 폴더의 변경사항을 추적하는 이유는, 이미 Git이 이전에 해당 폴더를 트래킹하고 있기 때문이다. .gitignore 파일을 설정한 후에는 Git에 해당 폴더를 무시하도록 아래와 같이 추가 조치를 취해보자.

  1. 추적된 my_ignore_folder/ 폴더의 캐시 삭제
    .gitignore에 추가된 폴더가 이미 Git에서 추적 중인 상태라면 캐시를 삭제해야 한다. 
     
    git rm -r --cached my_ignore_folder/
  2. 변경 사항 커밋
    캐시에서 삭제된 내용을 커밋하여 기록에 반영한다.
     
    git commit -m "Remove my_ignore_folder folder from tracking"
  3. 푸시
    원격 저장소에 반영하려면 다음과 같이 푸시한다.
  4. git push

이 작업을 마친 후, my_ignore_folder/ 폴더는 .gitignore 설정에 따라 무시되어, 이후 변경 사항이 발생해도 Git이 추적하지 않게 된다.

만약 git rm -r --cached my_ignore_folder/ 명령을 실행했음에도 불구하고 my_ignore_folder/ 폴더가 여전히 Git에서 추적되고 있다면, 다음 사항들을 점검하고 추가 조치를 취해보자.

  1. .gitignore 파일이 제대로 설정되었는지 확인
    • .gitignore 파일에서 my_ignore_folder/ 경로가 올바르게 작성되었는지 다시 한번 확인한다.
    • .gitignore 파일이 Git의 루트 디렉토리에 위치해 있는지 확인한다. 프로젝트의 루트 디렉토리가 아니라면 무시되지 않을 수 있다.
  2. .gitignore 파일에 추가적인 경로 지정
    • .gitignore에 my_ignore_folder/ 외에 my_ignore_folder/*과 같은 패턴을 추가해 보세요. 간혹 Git이 하위 파일을 인식하는 경우가 있기 때문에, 아래와 같이 설정할 수도 있습니다:
       
      my_ignore_folder/
      my_ignore_folder/*
  3. git status로 확인
    • 터미널에서 git status 명령을 실행하여 my_ignore_folder/가 추적되고 있는지 확인해보자.
  4. 폴더 강제 삭제 후 커밋
    • 위 방법이 모두 실패한 경우, 강제로 my_ignore_folder/ 폴더를 무시하도록 처리한다.
      git rm -rf --cached my_ignore_folder
      git commit -m "Force ignore my_ignore_folder folder"
      git push
    • 이 명령어는 캐시에서 삭제를 강제하여 .gitignore 파일이 무시되도록 한다.
  5. 로컬 및 원격에 남아 있는지 확인
    • 최종적으로 SourceTree나 다른 Git 클라이언트를 사용하여 로컬과 원격 브랜치 모두에 my_ignore_folder/폴더가 여전히 남아 있는지 확인한다.

 

반응형
블로그 이미지

SKY STORY

,
반응형

아래 오류 메시지는 git push 과정에서 네트워크나 git 서버 쪽에서 발생한 500 오류로 인해 연결이 끊어진 상황을 나타낸다. 이 문제는 주로 네트워크 상태나 원격 서버의 일시적인 오류로 인해 발생할 수 있지만, 몇 가지 설정을 조정해보면 해결할 수 있는 경우도 있다.

git --no-optional-locks -c color.branch=false -c color.diff=false -c color.status=false -c diff.mnemonicprefix=false -c core.quotepath=false -c credential.helper=sourcetree push -v --tags origin refs/heads/main:refs/heads/main 
Pushing to https://bitbucket.org/netcanis_workspace/gptapi.git
POST git-receive-pack (chunked)
error: RPC failed; HTTP 500 curl 22 The requested URL returned error: 500
send-pack: unexpected disconnect while reading sideband packet
fatal: the remote end hung up unexpectedly
Everything up-to-date
Completed with errors, see above

 

1. 캐시된 자격 증명 삭제 및 다시 로그인

git credential-osxkeychain erase

 

2. 푸시 버퍼 크기 증가

아래 설정은 500MB로 늘려주는 것으로, 서버와의 데이터 전송 오류를 해결할 수 있다. (대부분 이 문제이다.)

git config --global http.postBuffer 524288000

 

3. Bitbucket 서버 상태 확인

유지보수 작업등으로 인해 요류가 발생할 수 있다. (서버 상태를 확인해 본다.)

 

4. HTTP/2 사용 비활성화

일부 환경에서는 HTTP/2 프로토콜이 문제를 일으킬 수 있다. 아래 명령어를 통해 HTTP/2를 비활성화해 보자.

git config --global http.version HTTP/1.1

 

5. 다른 네트워크 사용

네트워크 연결 문제로 인해 푸시가 차단될 수 있다. 다른 네트워크(예: 핫스팟)로 전환 후 다시 푸시를 시도해 보자.

 

 

반응형

'개발 > Note' 카테고리의 다른 글

GitHub에서 포크한 저장소를 삭제  (0) 2024.11.06
특정 폴더 git 추적 삭제  (0) 2024.10.30
git 마지막 commit 취소, 메시지 수정  (0) 2024.10.16
BLE, Beacon, iBeacon  (0) 2024.01.11
BLE Advertising Payload format 샘플 분석  (1) 2024.01.11
블로그 이미지

SKY STORY

,
반응형

미래의 한국

by netcanis

 

한국의 인구 감소는 매우 빠른 속도로 진행되고 있다. 하지만 한국은 늘 그래왔듯 이번에도 해답을 찾을 것이다. 노동 인력의 감소를 보완하기 위해, 로봇과 인공지능(AI) 분야에서 세계적인 선두 주자로 자리 잡을 가능성이 크다.

현재 한국은 전 세계에서 사교육비 지출이 높은 국가 중 하나로, 학부모들이 막대한 비용을 투자하면서 고학력자가 빠르게 증가하고 있다. 향후 수십 년 안에는 대다수의 한국인이 고등 교육을 받은 인재가 될 가능성이 높지만, 이는 곧 사회 전반의 인력난과 특정 분야에 인재가 집중되는 현상을 심화시킬 수도 있다. 노동 시장의 불균형 속에서도 고학력화가 진행되는 한편, 필수 산업의 일손 부족 문제는 점차 더 심각해질 것이다.

인구 감소로 인한 인력 부족 문제는 초기에는 외국인 노동자를 유입시켜 해결하려 할 가능성이 크다. 그러나 로봇과 AI 기술이 발전함에 따라 이러한 인력은 점차 기술로 대체될 것이다. 이미 반복적인 단순 작업이나 위험하거나 고된 일자리에는 점차 로봇과 AI 기술이 도입되고 있으며, 앞으로 이러한 추세는 더욱 가속화될 전망이다.

이러한 도전에 대해 한국 사회가 이를 방관하지는 않을 것이다. 한국은 과거 수많은 도전과제에서 혁신적 해법을 찾아왔던 것처럼 이번에도 인구 감소 문제에 대한 해결책을 반드시 찾아낼 것이라 믿는다.

 

반응형

'생각의 조각들' 카테고리의 다른 글

인공지능의 학습 한계  (0) 2024.10.10
Breaking Free from Musical Conventions  (0) 2024.10.06
게으른 야망의 딜레마  (0) 2024.10.06
성공과 실패  (0) 2024.10.02
말이 통하지 않는 사람과 싸우지 말라.  (0) 2023.12.27
블로그 이미지

SKY STORY

,
반응형
 

알림 메시지, 데이터 메시지 차이점을 알아보자.


구분 알림 메시지 (Notification Message) 데이터 메시지 (Data Message)
목적 시스템이 자동으로 알림 표시 앱이 직접 알림을 처리해야 함
앱 상태 백그라운드/완전 종료에서도 알림 표시 가능 포그라운드 상태에서만 앱이 직접 처리 가능
구성 제목, 본문, 이미지 등 알림 내용 포함 데이터 키-값 쌍으로 구성
사용 예 간단한 알림 전송에 유용 앱에서 특정 작업 수행에 유용
배너 알림 표시 자동으로 베너 알림 표시 앱이 포그라운드일 때 코드로 구현 가능
예시 코드 { "notification": { "title": "알림 제목", "body": "알림 내용" } } { "data": { "key1": "value1", "key2": "value2" } }

 

요약 

알림 메시지 : 시스템이 자동으로 베너 형태의 알림을 관리해주며, 앱의 상태와 무관하게 표시된다.

데이터 메시지 : 앱이 실행 중일 때만 앱 내 코드로 처리할 수 있다. 베너 알림을 표시하려면 직접 구현해야 한다.

 

반응형

'개발 > Android' 카테고리의 다른 글

<application> 및 <activity> 태그 속성과 하위 요소  (0) 2024.10.25
멀티라인 Toast 메시지 출력  (0) 2024.10.24
NFC 권한설정  (1) 2024.10.21
NdefFormatable 태그  (0) 2024.10.21
NFC Tag 상세정보 출력  (2) 2024.10.18
블로그 이미지

SKY STORY

,
반응형
 

<application>  <activity> 태그의 속성과 하위 요소, 적용 가능 API, 필수여부 등을 정리해 보았다.

 

<application> 태그 속성

앱의 전체적인 설정을 제어하며, 여러 속성  하위 요소를 통해 앱의 동작, 권한, 리소스 등을 정의할  있다.

속성 적용 가능 API 버전
(Android 버전)
필수 여부 설명
android:icon API 1 (Android 1.0) 필수 앱의 기본 아이콘을 설정합니다.
android:label API 1 (Android 1.0) 선택 앱의 기본 이름(라벨)을 설정합니다.
android:theme API 1 (Android 1.0) 선택 애플리케이션의 기본 테마를 설정합니다.
android:permission API 1 (Android 1.0) 선택 앱에서 선언된 모든 컴포넌트에 적용되는 권한을 정의합니다.
android:debuggable API 1 (Android 1.0) 선택 디버깅 모드를 활성화할지 여부를 지정합니다.
android:enabled API 1 (Android 1.0) 선택 애플리케이션이 활성화 상태인지 여부를 지정합니다.
android:hasCode API 1 (Android 1.0) 선택 애플리케이션이 자체적으로 컴파일된 코드(DEX 파일)를 포함하는지 여부를 지정합니다.
android:persistent API 1 (Android 1.0) 선택 시스템 메모리에서 앱이 항상 실행 중인지 여부를 정의합니다.
android:taskAffinity API 1 (Android 1.0) 선택 애플리케이션의 태스크 친화도를 정의합니다.
android:process API 1 (Android 1.0) 선택 앱이 실행될 프로세스를 지정합니다.
android:allowTaskReparenting API 1 (Android 1.0) 선택 태스크 변경 시 액티비티가 재배치될 수 있는지 여부를 지정합니다.
android:killAfterRestore API 1 (Android 1.0) 선택 백업 후 애플리케이션을 종료할지 여부를 설정합니다.
android:restoreAnyVersion API 1 (Android 1.0) 선택 앱이 다른 버전의 백업 데이터를 복원할 수 있는지 여부를 설정합니다.
android:resizeableActivity API 1 (Android 1.0) 선택 애플리케이션의 액티비티가 크기 조정 가능한지 여부를 지정합니다.
android:usesCleartextTraffic API 1 (Android 1.0) 선택 앱에서 암호화되지 않은 트래픽을 허용할지 여부를 정의합니다.
android:installLocation API 8 (Android 2.2) 선택 앱이 설치될 위치를 지정합니다. (auto, internalOnly, preferExternal)
android:backupAgent API 8 (Android 2.2) 선택 백업 및 복원을 담당하는 백업 에이전트를 정의합니다.
android:allowBackup API 8 (Android 2.2) 선택 앱 데이터의 백업을 허용할지 여부를 정의합니다.
android:hardwareAccelerated API 11 (Android 3.0) 선택 애플리케이션에서 하드웨어 가속을 사용할지 여부를 설정합니다.
android:largeHeap API 11 (Android 3.0) 선택 애플리케이션이 더 큰 힙 메모리를 사용할 수 있는지 여부를 지정합니다.
android:vmSafeMode API 11 (Android 3.0) 선택 앱이 VM에서 안전 모드로 실행될지 여부를 지정합니다.
android:isGame API 19 (Android 4.4) 선택 앱이 게임인지 여부를 정의합니다.
android:banner API 20 (Android 4.4W) 선택 Android TV에서 사용할 배너 이미지를 지정합니다.
android:restrictedAccountType API 22 (Android 5.1) 선택 제한된 계정의 유형을 설정합니다.
android:fullBackupContent API 23 (Android 6.0) 선택 백업 내용과 제외 항목을 정의하는 XML 파일을 지정합니다.
android:roundIcon API 25 (Android 7.1) 선택 원형 아이콘을 지정합니다.
android:category API 26 (Android 8.0) 선택 애플리케이션의 카테고리를 정의합니다. (game, productivity, social 등)
android:appComponentFactory API 28 (Android 9.0) 선택 애플리케이션의 컴포넌트 생성을 처리하는 클래스를 지정합니다.
android:profileable API 29 (Android 10.0) 선택 애플리케이션이 성능 프로파일링이 가능한지 여부를 정의합니다.
android:dataExtractionRules API 31 (Android 12.0) 선택 앱의 데이터 추출 규칙을 정의하는 XML 파일 경로를 지정합니다.

<application> 태그 하위 요소

하위요소 적용 가능 API 버전
(Android 버전)
필수 여부 설명
<activity> API 1 (Android 1.0) 필수 앱의 액티비티를 선언합니다.
<service> API 1 (Android 1.0) 선택 백그라운드 작업을 수행하는 서비스 컴포넌트를 선언합니다.
<receiver> API 1 (Android 1.0) 선택 브로드캐스트 수신기를 선언합니다.
<provider> API 1 (Android 1.0) 선택 앱에서 데이터를 공유할 수 있는 콘텐츠 제공자를 선언합니다.
<uses-library> API 1 (Android 1.0) 선택 앱에서 사용할 추가 라이브러리를 선언합니다.
<meta-data> API 1 (Android 1.0) 선택 추가적인 메타데이터 정보를 설정합니다.
<activity-alias> API 1 (Android 1.0) 선택 기존 액티비티의 별칭을 정의하여 다른 이름으로 사용할 수 있도록 합니다.
<permission> API 1 (Android 1.0) 선택 앱에서 정의하는 권한을 선언합니다.
<permission-group> API 1 (Android 1.0) 선택 권한을 그룹화하여 선언합니다.
<permission-tree> API 1 (Android 1.0) 선택 권한의 계층 구조를 선언합니다.
<uses-permission> API 1 (Android 1.0) 선택 앱이 필요로 하는 권한을 정의합니다. 특정 기능을 사용하려면 권한 요청이 필요할 때 추가합니다.
<profileable> API 29 (Android 10.0) 선택 앱의 성능을 프로파일링할 수 있는지 여부를 정의합니다.

 


 

<activity> 태그 속성

액티비티의 동작과 속성을 정의한다. 앱의 개별 화면을 구성하며, 앱의 주요 동작 방식을 정의할 있다.

속성 적용 가능 API 버전
(Android 버전)
필수 여부 설명
android:name API 1 (Android 1.0) 필수 액티비티의 클래스 이름을 정의합니다.
android:label API 1 (Android 1.0) 선택 액티비티의 이름을 정의합니다.
android:theme API 1 (Android 1.0) 선택 액티비티에서 사용할 테마를 설정합니다.
android:icon API 1 (Android 1.0) 선택 액티비티에 사용할 아이콘을 설정합니다.
android:permission API 1 (Android 1.0) 선택 액티비티에 접근하기 위해 필요한 권한을 설정합니다.
android:configChanges API 1 (Android 1.0) 선택 액티비티가 처리할 구성 변경 사항을 설정합니다.
android:launchMode API 1 (Android 1.0) 선택 액티비티의 실행 모드를 지정합니다.
android:taskAffinity API 1 (Android 1.0) 선택 태스크의 친화도를 지정합니다.
android:windowSoftInputMode API 3 (Android 1.5) 선택 소프트 입력 모드의 동작을 설정합니다. (adjustResize, adjustPan 등)
android:hardwareAccelerated API 11 (Android 3.0) 선택 하드웨어 가속을 사용할지 여부를 설정합니다.
android:clearTaskOnLaunch API 1 (Android 1.0) 선택 태스크가 시작될 때 다른 액티비티를 모두 종료할지 여부를 설정합니다.
android:alwaysRetainTaskState API 1 (Android 1.0) 선택 태스크의 상태를 항상 유지할지 여부를 설정합니다.
android:autoRemoveFromRecents API 21 (Android 5.0) 선택 액티비티가 종료되면 최근 작업 목록에서 자동으로 제거될지 여부를 설정합니다.
android:allowEmbedded API 30 (Android 11.0) 선택 액티비티가 다른 액티비티 내에 임베드될 수 있는지 여부를 설정합니다.
android:exported API 31 (Android 12.0) 필수 외부에서 액티비티를 호출할 수 있는지 여부를 정의합니다.

<activity> 태그 하위 요소

하위요소 적용 가능 API 버전
(Android 버전)
필수 여부 설명
<intent-filter> API 1 (Android 1.0) 선택 액티비티가 처리할 수 있는 인텐트를 정의합니다.
<meta-data> API 1 (Android 1.0) 선택 액티비티에 대한 추가 메타데이터를 제공하여 앱 실행 시 필요한 정보를 설정할 수 있습니다.
<layout> API 1 (Android 1.0) 선택 액티비티가 사용할 레이아웃을 정의합니다. 보통 XML 파일로 참조됩니다.

 

<intent-filter> 태그 하위 요소

하위요소 적용 가능 API 버전
(Android 버전)
필수 여부 설명
<action> API 1 (Android 1.0) 필수 인텐트 필터에서 처리할 수 있는 인텐트 액션을 정의합니다. 예: android.intent.action.MAIN
<category> API 1 (Android 1.0) 선택 인텐트 필터에서 처리할 수 있는 인텐트 카테고리를 정의합니다. 예: android.intent.category.LAUNCHER
<data> API 1 (Android 1.0) 선택 인텐트 필터가 처리할 수 있는 데이터(URI, MIME 타입 등)를 정의합니다.

 

 

반응형

'개발 > Android' 카테고리의 다른 글

알림 메시지(Notification Message)와 데이터 메시지(Data Message)  (0) 2024.10.25
멀티라인 Toast 메시지 출력  (0) 2024.10.24
NFC 권한설정  (1) 2024.10.21
NdefFormatable 태그  (0) 2024.10.21
NFC Tag 상세정보 출력  (2) 2024.10.18
블로그 이미지

SKY STORY

,
반응형

Toast가 여러 줄로 출력되지 않는 경우는 디바이스의 화면 크기텍스트의 길이 때문이다. 그래서 여러 줄을 출력하기위해 TextView를 사용하는 MultiLine Toast를 만들어 보았다.

 

1. res/layout/multiline_toast.xml 파일 생성:

<!-- res/layout/multiline_toast.xml -->
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:background="@android:color/black"
    android:padding="10dp"
    android:orientation="vertical">

    <TextView
        android:id="@+id/multiline_toast_text"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textColor="@android:color/white"
        android:textSize="16sp"/>
</LinearLayout>

 

2. showMultiLineToast 함수 작성:

private fun showMultiLineToast(message: String) {
    // 1. LayoutInflater를 사용해 multiline_toast 레이아웃을 불러옴
    val inflater = layoutInflater
    val layout = inflater.inflate(R.layout.multiline_toast, findViewById(R.id.multiline_toast_text))

    // 2. multiline_toast 레이아웃의 TextView에 메시지를 설정
    val textView: TextView = layout.findViewById(R.id.multiline_toast_text)
    textView.text = message

    // 3. Toast에 multi-line layout을 설정
    with(Toast(applicationContext)) {
        duration = Toast.LENGTH_LONG
        view = layout
        show()
    }
}

 

3. 사용 예시:

val message = """
    BLE 스캔 성공:
    deviceName: ${result.deviceName}
    RSSI: ${result.rssi}
    data: ${result.data}
""".trimIndent()

showMultiLineToast(message)  // Multi-line Toast로 출력

 

 

반응형
블로그 이미지

SKY STORY

,

NFC 권한설정

개발/Android 2024. 10. 21. 11:50
반응형

NFC 태그 사용을 위한 권한설정에 대해 알아보겠다.

NFC 태그가 앱에 의해 감지될 때 android.nfc.action.TAG_DISCOVERED는 NFC 태그가 감지될 때 인텐트를 전달하는 데 필요하다. 이를 위해 AndroidManifest.xml에 설정을 추가해야 한다. 이 설정은 TAG_DISCOVERED, TECH_DISCOVERED, NDEF_DISCOVERED와 같은 액션을 통해 NFC 태그 감지 시 앱으로 인텐트를 전달하는 역할을 한다.

 

권한 설명

  1. android.nfc.action.NDEF_DISCOVERED:
    NDEF 메시지를 포함한 NFC 태그가 감지되었을 때 작동하는 액션이다. 주로 특정 애플리케이션 데이터 또는 MIME 타입이 있는 태그에서 사용된다.
  2. android.nfc.action.TAG_DISCOVERED:
    NFC 태그가 감지되었을 때 작동하는 기본 액션으로, NDEF 메시지가 포함되지 않은 모든 NFC 태그를 처리할 수 있다.
  3. android.nfc.action.TECH_DISCOVERED:
    태그가 특정 기술(예: NfcA, MifareUltralight 등)을 지원할 때 작동한다. 이를 통해 특정 기술 스택을 가진 태그를 처리할 수 있다. 예를 들어 nfc_tech_filter.xml에서 정의된 기술과 일치하는 태그가 감지되었을 때 인텐트를 처리한다.

추가 설명

  • MIME 타입은 NDEF 태그의 데이터를 처리할 때 필수입니다. 예를 들어, "text/plain"은 특정 애플리케이션 데이터 타입을 지정한 것입니다.
  • NDEF_DISCOVERED는 NDEF 메시지가 포함된 태그만 처리할 수 있으므로, 태그의 내용이 특정 유형(MIME 타입)일 때만 작동하게끔 설정됩니다.
  • TECH_DISCOVERED는 기술 스택을 기반으로 태그를 처리하며, nfc_tech_filter.xml에서 정의한 기술과 일치하는 태그가 감지되면 작동합니다.

AndroidManifest.xml 에 추가된 설정 예 :

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.mwkg.testwebview">


    <!-- NFC 권한 설정 -->
    <uses-permission android:name="android.permission.NFC"/>

    <application
        android:allowBackup="true"
        android:dataExtractionRules="@xml/data_extraction_rules"
        android:fullBackupContent="@xml/backup_rules"
        android:icon="@mipmap/ic_launcher"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/Theme.TestWebView">

        <!-- FCM 푸시 알림 서비스 등록 -->
        <service
            android:name=".MyFirebaseMessagingService"
            android:exported="true"
            android:permission="com.google.android.c2dm.permission.SEND">
            <intent-filter>
                <action android:name="com.google.firebase.MESSAGING_EVENT" />
            </intent-filter>
        </service>

        <activity
            android:name=".MainActivity"
            android:exported="true"
            android:label="@string/app_name"
            android:theme="@style/Theme.TestWebView">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>

            <!-- NFC NDEF 태그 인텐트 필터 -->
            <intent-filter>
                <!-- NDEF 메시지를 포함한 NFC 태그가 감지될 때 앱으로 인텐트를 전달 -->
                <action android:name="android.nfc.action.NDEF_DISCOVERED" />
                <category android:name="android.intent.category.DEFAULT" />

                <!-- NDEF 메시지에서 처리할 MIME 유형 지정 (예: 특정 애플리케이션 또는 텍스트 MIME 유형) -->
                <data android:mimeType="text/plain" />  <!-- ex: "text/plain" 또는 "application/vnd.*" -->
            </intent-filter>

            <!-- NFC 태그 인텐트 필터 -->
            <intent-filter>
                <!-- 모든 NFC 태그가 감지될 때 앱으로 인텐트를 전달 (NDEF 메시지가 없을 때도 작동) -->
                <action android:name="android.nfc.action.TAG_DISCOVERED" />
                <category android:name="android.intent.category.DEFAULT" />
            </intent-filter>

            <!-- NFC 기술 인텐트 필터 -->
            <intent-filter>
                <!-- NFC 태그에 기술 스택이 감지되면 앱으로 인텐트를 전달 (특정 기술 유형을 지원하는 태그를 처리) -->
                <action android:name="android.nfc.action.TECH_DISCOVERED" />
                <category android:name="android.intent.category.DEFAULT" />
            </intent-filter>

            <!-- NFC 기술 필터 설정 (nfc_tech_filter.xml 파일을 참조하여 특정 기술을 처리) -->
            <meta-data
                android:name="android.nfc.action.TECH_DISCOVERED"
                android:resource="@xml/nfc_tech_filter" />
        </activity>
    </application>

</manifest>

 

nfc_tech_filter.xml 사용 예 :

<?xml version="1.0" encoding="utf-8"?>
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
    <!-- Ndef 태그 (NFC Data Exchange Format) -->
    <tech-list>
        <tech>android.nfc.tech.Ndef</tech>
    </tech-list>

    <!-- NdefFormatable 태그 (NFC 태그를 NDEF 형식으로 포맷할 수 있는 경우) -->
    <tech-list>
        <tech>android.nfc.tech.NdefFormatable</tech>
    </tech-list>

    <!-- NfcA 태그 (ISO 14443-3A) -->
    <tech-list>
        <tech>android.nfc.tech.NfcA</tech>
    </tech-list>

    <!-- NfcB 태그 (ISO 14443-3B) -->
    <tech-list>
        <tech>android.nfc.tech.NfcB</tech>
    </tech-list>

    <!-- NfcF 태그 (Felica, JIS 6319-4) -->
    <tech-list>
        <tech>android.nfc.tech.NfcF</tech>
    </tech-list>

    <!-- NfcV 태그 (ISO 15693) -->
    <tech-list>
        <tech>android.nfc.tech.NfcV</tech>
    </tech-list>

    <!-- IsoDep 태그 (ISO 14443-4) -->
    <tech-list>
        <tech>android.nfc.tech.IsoDep</tech>
    </tech-list>

    <!-- MifareClassic 태그 -->
    <tech-list>
        <tech>android.nfc.tech.MifareClassic</tech>
    </tech-list>

    <!-- MifareUltralight 태그 -->
    <tech-list>
        <tech>android.nfc.tech.MifareUltralight</tech>
    </tech-list>



    <!-- 기술 조합이 필요한 경우 -->
    <!-- NfcA와 Ndef, MifareUltralight를 동시에 지원하는 태그 -->
    <tech-list>
        <tech>android.nfc.tech.NfcA</tech>
        <tech>android.nfc.tech.Ndef</tech>
        <tech>android.nfc.tech.MifareUltralight</tech>
    </tech-list>
</resources>

 

 

반응형
블로그 이미지

SKY STORY

,