2024년 5월 16일 목요일

Android Jetpack viewpager2

 Android Jetpack ViewPager2 기본 개념 및 샘플 코드


오늘은 안드로이드 개발에 있어서 굉장히 유용한 컴포넌트 중 하나인 ViewPager2에 대해 이야기해볼까 합니다. ViewPager2는 사용자 인터페이스에서 여러 화면을 좌우로 스와이프하여 넘길 수 있게 해주는 아주 멋진 라이브러리인데요. 기본 개념부터 시작해서 간단한 샘플 코드까지, 함께 알아보도록 할게요!

Android Jetpack ViewPager2 소개
Android Jetpack의 일부인 ViewPager2는 안드로이드 기기에서 화면을 전환하는 라이브러리입니다. 이전 버전인 ViewPager에 비해 성능과 유연성이 개선되었습니다. 

ViewPager2는 RecyclerView와 같은 어댑터 뷰(Adapter View)로, 데이터 소스(DataSource)로부터 페이지를 가져와 표시합니다. 각 페이지는 Fragment 또는 Activity로 구성될 수 있습니다. 

주요 특징은 다음과 같습니다. 

- 성능 향상: ViewPager2는 RecyclerView와 동일한 RecyclerView 엔진을 사용하므로 스크롤링 및 페이지 전환이 부드럽고 빠릅니다. 

- 유연성: 수직 및 수평 스크롤을 지원하며, 페이지 크기를 동적으로 조정할 수 있습니다. 멀티 터치 및 제스처를 처리하는 방식을 커스터마이징 할 수도 있습니다.

- API 단순화: API가 직관적이고 간단하여 사용하기 쉽습니다. 기존의 ViewPager와 달리 데이터 바인딩 및 LiveData를 지원합니다.

다음은 간단한 ViewPager2 구현 예시입니다.

public class MainActivity extends AppCompatActivity {

  private ViewPager2 viewPager;
  private MyPageAdapter adapter;

  @Override
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    viewPager = findViewById(R.id.viewpager);
    adapter = new MyPageAdapter(this);
    viewPager.setAdapter(adapter);
  }
}

class MyPageAdapter extends FragmentStateAdapter {
  public MyPageAdapter(@NonNull FragmentActivity fragmentActivity) {
    super(fragmentActivity);
  }

  @NonNull
  @Override
  public Fragment createFragment(int position) {
    return PageFragment.newInstance(position);
  }

  @Override
  public int getItemCount() {
    return 3; //페이지 수
  }
}


위 코드는 세 개의 페이지를 가진 ViewPager2를 구현한 예시입니다. `MyPageAdapter` 클래스는 `FragmentStateAdapter`를 상속받아 페이지를 관리합니다. 각 페이지는 `createFragment()` 메서드에서 생성되며, `getItemCount()` 메서드는 페이지 수를 반환합니다. 이렇게 설정된 어댑터를 `viewPager`에 연결하면 페이지가 표시됩니다.

ViewPager2의 기능적 특성 이해하기
안드로이드 앱 개발에서 ViewPager2는 탭 형태의 인터페이스나 갤러리 인터페이스를 만드는데 유용한 도구 입니다. 아래에서는 ViewPager2의 주요 기능적 특성을 살펴 보겠습니다.

1.부드러운 스크롤링과 빠른 페이지 전환: ViewPager2는 RecyclerView와 같은 엔진을 사용하여 부드러운 스크롤링과 빠른 페이지 전환을 제공합니다. 이로 인해 사용자는 인터랙션 동안 원활한 경험을 할 수 있습니다.

2.직관적인 API: ViewPager2의 API는 간단하고 직관적이므로 쉽게 사용할 수 있습니다. XML 레이아웃 파일에서 간단히 참조하거나 Java 코드에서 인스턴스화 할 수 있습니다.

3.다양한 방향의 스크롤 지원: ViewPager2는 전통적인 수평 스크롤 뿐만 아니라 수직 스크롤도 지원합니다. 이를 통해 보다 다양한 UI 디자인을 구현할 수 있습니다.

4.동적 페이지 크기 조정: ViewPager2는 페이지 크기를 동적으로 조정할 수 있는 기능을 제공합니다. 이는 화면 크기나 디바이스 종류에 따라 페이지 크기를 적절하게 조정하는데 유용합니다.

5.멀티 터치 및 제스처 처리: ViewPager2는 멀티 터치 및 제스처를 처리하는 강력한 기능을 가지고 있습니다. 사용자가 손가락을 이용하여 페이지를 스와이프하거나 드래그 할 때 이를 인식하고 반응합니다.


이러한 기능들을 활용하여 안드로이드 앱에서 다양한 형태의 슬라이딩 인터페이스를 구현할 수 있습니다.

ViewPager2 구현을 위한 준비사항
뷰 페이저2를 프로젝트에 추가하려면 다음 단계를 따르세요:

1.build.gradle (Module: app) 파일에 의존성 추가: 뷰 페이저2 라이브러리를 사용하려면 프로젝트의 build.gradle (Module: app) 파일에 androidX 패키지 종속성을 추가해야 합니다. 

최신 버전은 아래 링크 참고

gradle
dependencies {
implementation 'androidx.viewpager2:viewpager2:1.1.0'
}

2.레이아웃 XML 파일에 뷰 페이저2 선언: 액티비티의 XML 레이아웃 파일에 뷰 페이저2 위젯을 선언하세요. 일반적으로 이것은 루트 ViewGroup 안에 배치됩니다.

xml
android:id="@+id/view_pager"
android:layout_width="match_parent"
android:layout_height="match_parent"/>

위의 단계를 완료하면 이제 뷰 페이저2를 사용하여 안드로이드 앱에 슬라이딩 인터페이스를 구현할 준비가 되었습니다.


간단한 ViewPager2 예제 코드 분석
다음은 간단한 ViewPager2 예제 코드입니다.

public class MainActivity extends AppCompatActivity {

  private ViewPager2 viewPager;
  private MyAdapter adapter;

  @Override
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    viewPager = findViewById(R.id.view_pager);
    adapter = new MyAdapter(this);
    viewPager.setAdapter(adapter);
  }

  public class MyAdapter extends RecyclerView.Adapter {
    private List dataSet;

    public MyAdapter(Context context) {
      dataSet = new ArrayList<>();
      for (int i = 0; i < 10; i++) {
        dataSet.add("Item " + i);
      }
    }

    @NonNull
    @Override
    public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
      LayoutInflater inflater = LayoutInflater.from(parent.getContext());
      View view = inflater.inflate(R.layout.item_view, parent, false);
      return new ViewHolder(view);
    }

    @Override
    public void onBindViewHolder(@NonNull ViewHolder holder, int position) {
      holder.textView.setText(dataSet.get(position));
    }

    @Override
    public int getItemCount() {
      return dataSet.size();
    }

    public class ViewHolder extends RecyclerView.ViewHolder {
      TextView textView;

      public ViewHolder(@NonNull View itemView) {
        super(itemView);
        textView = itemView.findViewById(R.id.text_view);
      }
    }
  }
}

이 코드는 뷰 페이저2를 사용하여 페이지를 스크롤링하는 예시입니다. MainActivity 클래스에서는 뷰 페이저 인스턴스와 어댑터를 생성하고, 그것을 뷰 페이저에 연결합니다. 어댑터(MyAdapter)는 리사이클러뷰 어댑터를 상속하며, 데이터셋을 정의하고 각 항목에 대한 뷰 홀더를 생성합니다.


페이지 전환 효과와 커스터마이징
기본적으로 ViewPager2는 페이지 전환 시 부드럽게 미끄러지는 효과를 제공합니다. 하지만 이 효과를 사용하지 않거나, 다른 효과로 변경하거나, 추가적인 애니메이션을 적용하여 페이지 전환을 커스터마이징 할 수도 있습니다.

- 전환 효과: 
사용하지 않으려면 setPageTransformer(false)를 호출합니다. 원하는 효과를 직접 구현하려면 setPageTransformer() 메소드에 ViewPager2.PageTransformer 인터페이스를 구현한 객체를 전달합니다.

이상 끝.


2024년 5월 15일 수요일

구글 blogger 소스 코드 code-prettify

구글 blogger 소스 코드 code-prettify 적용하기

 

구글 blogger 좌측 메뉴 -> 테마 선택

 

 
맞춤설정 하위 메뉴 ->HTML 편집 선택
 
 
 

 
 
</head> 를 찾아 위에다가 구글에서 만든 아래 script 추가
 
<script src="https://cdn.jsdelivr.net/gh/google/code-prettify@master/loader/run_prettify.js"></script> 
 
출처 : https://github.com/googlearchive/code-prettify


 

코드가 사용될 블로그에서 HTML 모드로 변경 후 아래 추가

<pre class="prettyprint">

여기에 코드 작성

</pre>

 

Android Framework - ACTION BOOT COMPLETE

부팅완료시 ACTION BOOT COMPLETE 보내는 부분

분석버전 : Froyo
android\frameworks\base\services\java\com\android\server\am

ActivityManagerService.java


final void finishBooting() {
        IntentFilter pkgFilter = new IntentFilter();
        pkgFilter.addAction(Intent.ACTION_QUERY_PACKAGE_RESTART);
        pkgFilter.addDataScheme("package");
        mContext.registerReceiver(new BroadcastReceiver() {
            @Override
            public void onReceive(Context context, Intent intent) {
                String[] pkgs = intent.getStringArrayExtra(Intent.EXTRA_PACKAGES);
                if (pkgs != null) {
                    for (String pkg : pkgs) {
                      synchronized (ActivityManagerService.this) {
                        if (forceStopPackageLocked(pkg, -1, false, false, false)) {
                            setResultCode(Activity.RESULT_OK);
                            return;
                        }
                      }
                    }
                }
            }
        }, pkgFilter);

        synchronized (this) {
            // Ensure that any processes we had put on hold are now started up.
            final int NP = mProcessesOnHold.size();
            if (NP > 0) {
                ArrayList procs = new ArrayList(mProcessesOnHold);
            }
            for (int ip=0; ip < NP; i++) {
                this.startProcessLocked(procs.get(ip), "on-hold", null);
            }

            if (mFactoryTest != SystemServer.FACTORY_TEST_LOW_LEVEL) {
                // Tell anyone interested that we are done booting!
                broadcastIntentLocked(null, null,                       // <------ 0="" android.manifest.permission.receive_boot_completed="" code="" false="" intent="" my_pid="" new="" ntent.action_boot_completed="" null="" process.system_uid="">





Android ListAdapter

https://developer.android.com/reference/androidx/recyclerview/widget/ListAdapter

# 안드로이드 ListAdapter 사용하기: 효율적인 RecyclerView 업데이트

안드로이드 개발에서 RecyclerView는 매우 중요한 UI 컴포넌트입니다.

데이터 리스트를 효율적으로 표시하고 관리할 수 있게 해줍니다.

이번 포스팅에서는 RecyclerView에서 ListAdapter를 사용하는 방법에 대해 자세히

알아보겠습니다.


# ListAdapter란?

ListAdapter는 RecyclerView.Adapter를 상속하는 클래스입니다.

따라서 onCreateViewHolder, onBindViewHolder와 같은 기본적인 작업을 오버라이드할 수 있습니다.

ListAdapter의 핵심 기능은 DiffUtil을 활용해서 리스트를 효율적으로 업데이트하는 것입니다.

기존 데이터와 새로운 데이터를 비교해서 변경된 부분만 업데이트하므로,

전체 리스트를 다시 그릴 필요가 없습니다.

이를 통해 UI 성능을 크게 향상시킬 수 있습니다.

ListAdapter는 내부적으로 AsyncListDiffer 클래스를 사용하여 이 기능을 구현합니다.

AsyncListDiffer는 백그라운드 스레드에서 데이터 비교를 수행하고,

변경 사항을 UI 스레드에 전달합니다.

# ListAdapter 사용법

1. ListAdapter 클래스 정의

   - RecyclerView.Adapter를 상속하고 ListAdapter를 구현합니다.

   - 데이터 모델 클래스와 DiffUtil.ItemCallback 구현체를 제네릭 타입으로 지정합니다.

2. DiffUtil.ItemCallback 구현

   - areItemsTheSame: 두 항목이 동일한지 확인합니다.

   - areContentsTheSame: 두 항목의 내용이 동일한지 확인합니다.

3. onCreateViewHolder, onBindViewHolder 구현

   - 기존 RecyclerView.Adapter와 동일한 방식으로 구현합니다.

4. 데이터 업데이트

   - submitList 메서드를 사용하여 새로운 데이터 리스트를 전달합니다.

   - ListAdapter가 내부적으로 DiffUtil을 사용하여 변경 사항을 계산하고 UI를 업데이트합니다.


다음은 ListAdapter 사용 예시 코드입니다

class MyAdapter : ListAdapter(MyDiffCallback()) {
    
    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): MyViewHolder {
        // ViewHolder 생성 코드
    }

    override fun onBindViewHolder(holder: MyViewHolder, position: Int) {
        // ViewHolder 바인딩 코드
    }

    class MyDiffCallback : DiffUtil.ItemCallback() {
        override fun areItemsTheSame(oldItem: MyData, newItem: MyData): Boolean {
            return oldItem.id == newItem.id
        }

        override fun areContentsTheSame(oldItem: MyData, newItem: MyData): Boolean {
            return oldItem == newItem
        }
    }
}

// 데이터 업데이트
val newList = listOf(/* 새로운 데이터 */)
myAdapter.submitList(newList)

# ListAdapter의 장점

1. UI 성능 향상

 - DiffUtil을 사용하여 변경된 부분만 업데이트하므로 전체 리스트를 다시 그릴 필요가 없어 UI 성능이 향상됩니다.

2. 코드 간결성

 - 기존 RecyclerView.Adapter에 비해 코드가 간결해집니다. DiffUtil 관련 로직을 직접 구현할 필요가 없습니다.

3. 유지보수성 향상 

 - 데이터 모델 클래스와 DiffUtil.ItemCallback 구현체를 분리하여 관리할 수 있어 유지보수성이 향상됩니다.

 

# 추가 정보: DiffUtil

DiffUtil은 두 리스트 간의 차이를 계산하는 유틸리티 클래스입니다.

ListAdapter는 DiffUtil을 활용하여 리스트 업데이트를 효율적으로 수행합니다.

DiffUtil.ItemCallback 구현체에서는 다음과 같은 메서드를 오버라이드해야 합니다

 - areItemsTheSame : 두 항목이 동일한지 확인합니다. 일반적으로 고유 식별자

  (예: id)를 비교합니다.

- areContentsTheSame : 두 항목의 내용이 동일한지 확인합니다. 데이터 모델 클래스의 필드 값을 비교합니다.

DiffUtil은 이 정보를 바탕으로 기존 리스트와 새로운 리스트 간의 차이를 계산하고, 변경된 부분만 업데이트합니다.


이상으로 안드로이드 코틀린에서 ListAdapter 사용법에 대해 알아보았습니다.

ListAdapter를 사용하면 RecyclerView의 UI 성능을 크게 향상시킬 수 있습니다. 

데이터 모델 클래스와 DiffUtil.ItemCallback 구현체를 분리하여 관리함으로써

코드의 간결성과 유지보수성도 높일 수 있습니다. 

 

Google Lookout


Google Lookout: 어떤 시각 장애인을 도와주는 안드로이드 앱일까?


Google Lookout은 시각장애인이 주변 환경을 더 잘 인식할 수 있도록 도와주는 안드로이드 앱이에요.

Lookout은 사물, 이미지, 텍스트 등에 대한 세부 정보를 인식하고 설명해요.

카메라를 이용하여 일상 업무를 보다 효율적으로 수행할 수 있도록 도와주며, 문서 읽기, 우편 정리, 식료품 정리 등의 작업을 수행할 수 있어요.

Lookout는 텍스트 읽기, 물체 탐색, 통화와 음식 라벨 식별, 이미지 설명 등을 지원하며, Google Play Store에서 Lookout를 다운로드하여 사용할 수 있어요.

 
 
 

Lookout 앱의 주요 기능


도큐먼트 모드를 활용하여 책이나 손으로 쓴 편지를 읽을 수 있고, Lookout은 문서를 자동으로 캡처하고 읽어줘요.

리딩 툴바로 분량 읽기를 조절하거나 속도 조절할 수 있고, 설정 아이콘으로 설정을 조정할 수 있어요.

음식 라벨 모드를 통해 포장된 식품 제품 앞의 라벨을 스캔하고 인식 가능하며, 통화 모드로는 특정 통화를 식별할 수 있어요.

Lookout의 이미지 모드는 사진을 설명하고, 영어 캡션을 제공하며 이미지를 다른 앱에 공유할 수 있어요.

 
 
 

Lookout 사용법과 설정 변경 방법


최근 목록에서 Lookout이 감지한 아이템의 이력을 검토할 수 있고, 다른 사람과 공유할 수 있어요.

Lookout은 기본적으로 안드로이드 폰과 동일한 설정을 사용하지만, 언어를 바꾸려면 지구 모양 아이콘을 클릭하면 돼요.

음식 라벨 모드의 국가 또는 통화 모드를 변경하고 싶다면, 각 모드의 상단 아이콘을 탭하세요.

국가 또는 통화를 변경하면 해당 국가의 새로운 데이터를 다운로드하도록 메시지가 표시돼요.



 

Android 14 새로운 기능

 


안드로이드 14의 새로운 기능은?


구글이 안드로이드 14에서 사용 가능한 새로운 기능 14가지를 소개해요.

안전성과 개인정보 보호에서 자동으로 PIN 확인 옵션을 추가하여 사용자들의 편의를 높였어요.

기존에는 적용되지 않았던 점으로, 전원을 켠 직후나 재부팅 후에도 사용할 수 있죠.

PIN을 설정한 후에 '설정 - 보안 및 개인정보 - 기기 잠금 방식 - 화면 잠금 - 최소한 6자리 코드 입력 - 자동으로 올바른 PIN 확인'으로 설정할 수 있어요.


분할 화면 기능 업그레이드 내용


분할 화면 기능이 개선되어 더 명확하게 각 애플리케이션의 레이아웃을 보여줘요.

세로나 가로 방향으로 태블릿을 사용할 때도 가능하며, split-screen 모드 진입 시 어플리케이션이 어디에 나타날지 이해하기 쉽게 변화시켰어요.

첫 번째 애플리케이션과 함께 사용할 경우에도 더 명확한 선택을 위해 첫 번째 애플리케이션에 더 잘 보이는 split-screen 진입 옵션이 있다요.


새로운 잠금 화면 시계 스타일 기능은?


안드로이드 14에서는 잠금 화면 시계를 8가지 사전 설정된 스타일 중 하나로 변경할 수 있는 편리한 기능이 추가돼요.

기술적으로는 16가지 스타일이 있지만, 선호하는 스타일이 작은 좌측 상단 시계라면 강제로 선택할 수 있어요.

이러한 스타일은 기본적으로 '다이나믹 컬러 설정'에 기반하지만, 원하는 경우 제한된 팔레트 옵션 중에서 선택할 수 있어요.

구글이 '메테리얼 U'를 계속 발전시킨다면 미래에는 튜닝 옵션을 더욱 확장할 것으로 기대돼요.

안드로이드에 적용된 이 옵션은 미래에는 튜닝 옵션을 더욱 확장하고 산재된 것과는 다른 매력을 제시하게 될 것이에요.


새 미니 게임과 예측 백 제스처


안드로이드 14에서 'About Phone'으로 이동하여 소프트웨어 빌드에 대한 Android 14 옵션을 찾은 후, 해당 옵션을 여러 번 누르거나 탭하여 Android 14 로고가 표시될 때까지 기다려요.

로고를 길게 누르면 우주선처럼 부서져 나가며, 이것만으로도 꽤 멋져요.

하지만 공간 테마에 따라 계속 진행되는, 보다 어렵게 보이는 새로운 '루나 미니 게임'으로 진입하게 돼요.

이러한 게임들의 부활을 보는 것이 좋으며, 사용자 본인이 직접 시도해보기를 강력히 추천해요.

또한, 안드로이드 14에서 예측 백 제스처가 새롭게 추가되어 개발자 옵션에서 토글로 숨겨져 있다는 점에 주목할 필요가 있어요.


안드로이드 14에서 사용자 경험의 주요 변경점?


안드로이드 14에서는 제스처 네비게이션으로 백 제스처를 사용할 때, 목적지 시스템 미리보기가 가능해져 부드럽고 세련된 애니메이션을 제공하고 있어요.

픽셀폰에 충전기를 연결할 때 새로운 애니메이션도 추가되어, 동적 색상의 작은 알약 모양으로 배터리 인디케이터가 변하는 것이 특징이에요.

안드로이드 14에서는 PIN 입력 확인 및 잠금 화면 스킵할 수 있게 되었으며, 키 누름 감지 시 이제는 이전 버전의 점과 원 대신 작은 머티리얼 UI 아이콘으로 표시되죠.

이러한 변화들은 안드로이드 14에서의 사용자 경험과 디자인 변화 중 하나로, 픽셀폰 사용자들이 소중히 여기는 구글이 도입하는 변화의 한 부분입니다.


픽셀 버전 안드로이드의 새로운 변화


픽셀 버전의 Android에서 시각적으로 중요한 새로운 변화인 플래시 통지 기능이 추가되었어요.

이는 새로운 알림이 도착했음을 시각적으로 알려주는 접근성 기능이죠.

앱 알림 도착 시 디스플레이에 번쩍이는 색상을 설정할 수 있고 12가지 색상 중 선택 가능하죠.

뿐만 아니라, 플래시 통지 설정으로 카메라 플래시를 깜박이는 대신 펄스 설정할 수 있어요.

또한, 기기의 제스처 네비게이션 영역을 투명하게 설정하는 기능도 추가되었어요.

이는 개발자 옵션 섹션에서 설정하는데, 흑백으로 주의를 분산시킬 수 있다는 점을 유의해야 해요.


Android 12의 미디어 플레이어와 애니메이션의 변화


화면을 좌나 우측에서 스와이프하면 UI에서 뒤로 이동하는 가이드 서클이 나타나죠.

가이드 서클의 색상은 시스템 테마의 색상과 일치하며, Google은 이를 통해 안드로이드 12 이후부터 중요한 부분이 된 테마를 지원하기 위한 노력을 보여준다고 해요.

Google은 시스템 미디어 플레이어를 계속 발전시키고 있고, 올해는 미디어 플레이어 사용 시 파도 타는 빛나는 애니메이션 효과가 추가되었어요.

이전에 베타 버전에 있던 효과가 안정적인 안드로이드 빌드에 포함되며, 리파인된 잠금 화면 공개 애니메이션이 함께 업데이트되었답니다.


밝은 색을 좋아하지 않는 사람을 위한 옵션이 추가된 이유


동영상에서 동적 컬러 테마에 관한 이야기를 계속하고 있어요.

밝고 장난기 많은 색상을 좋아한다면 훌륭한 선택이에요.

그러나 이제는 화면 배경 및 스타일 앱에 단색 옵션이 추가되어, 휴대폰에서 밝은 색상을 좋아하지 않는 경우에도 선택할 수 있어요.

특별한 에디션은 아니지만, 대담한 색상을 좋아하지 않는다면 좀 더 간단하게 유지할 수 있는 옵션이 추가되었다.

이제 안드로이드 14에서는 잠금 화면 퀵 토글을 사용자 정의하거나 완전히 비활성화할 수 있게 되었어요.


One UI의 단축키 활용 방법


One UI에서 단축키는 디폴트 카메라, 비공개 모드, 구글 홈 컨트롤, 빠른 음소거 스위치, QR 코드 스캐너, 손전등 또는 토치 옵션, 비디오 카메라 모드 등 포함하여 8가지로 제한돼요.

이 단축키를 탭하거나 실수로 그럴 경우, 폰이 흔들리면서 진동으로 알려주며 완전히 해제하거나 액세스할 수 있도록 길게 눌러야 해요. 안드로이드 14에서는 애플리케이션 간 텍스트 복사가 편리해지고, 텍스트를 선택하고 길게 누른 뒤 다른 애플리케이션 텍스트 입력 창으로 끌어다 이동하여 즉시 붙여넣기할 수 있어요.

휴대폰 화면에서 사용하기에는 쉽지 않은 제스처이지만, 분할 화면 모드를 사용하거나 Pixel Fold나 Pixel Tablet 같은 큰 화면 기기를 사용할 때 유용하구요.

안드로이드 14의 최신 기능 14가지를 Pixel 폰에서 알아두어야 해요.



G
M
T
Y
음성 기능은 200자로 제한됨

2024년 5월 2일 목요일

Android 15 Beta 1

- 안드로이드 15 베타1 에서는 무엇을 다루나요?


안드로이드 15의 첫 공개 베타 버전에 대해 소개하며, 무료 라이트 모드 배경화면을 제공해요.


2,500개의 좋아요가 달리면 다크 모드 버전도 제공한다고 약속하며, 베타 1에서 새로워진 내용을 알아봅니다.


구독 유도를 하며, Android 15 관련 콘텐츠를 더 많이 받아보라고 권유하고, 딥 다이브 형식의 콘텐츠를 추구한다고 합니다.



- 안드로이드 15 Beta 1에서 구글 지갑 앱의 기본 설정과 보안 개선사항은?


안드로이드 15 Beta 1에서는 기기에 기본으로 설정할 수 있는 지갑 애플리케이션 기능이 추가됐어요.


기본 설정 앱을 변경하면 이제 NFC 결제가 처리되고, 기존 Pixel은 Google Wallet 앱으로 설정되지만 다른 어플은 이를 제어할 수 없죠.


기능을 완전히 비활성화도 가능하며, 기기 이름을 공유하지 않도록 하는 새로운 토글도 있어 개인정보 보호를 향상시켰어요.


또한, Android 15 beta 1에서는 셀룰러 네트워크 보안 메뉴를 통해 안전하지 않은 네트워크를 감지하고 이를 알리는 기능이 추가되었어요.



- 안드로이드 15 베타 1의 주요 변경 사항은?


안드로이드 15 베타 1의 중요한 변경 사항은 애플리케이션 내에서 정보를 프로파일링할 수 있는 개발자 기능이에요.


일반 사용자들을 위해서는 이는 개발자 옵션에서 메모리 사용량을 확인할 수 있는 기능으로 나타나죠.


베타 1에서는 이 추적 기능을 비활성화 또는 활성화할 수 있어요.


기본적으로 비활성화되어 있으며, 시간에 따라 전화기에서 사용 중인 메모리 용량을 확인하려면 재시동이 필요해요.


작은 UI 변경 사항과 조정이 많이 있지만, 원하는 대로 이 추적 기능을 활성화 또는 비활성화할 수 있는 옵션이 있어요.



- 안드로이드 15 베타 1 빌드의 새로운 변화와 이슈


안드로이드 15 베타 1 빌드에서 빅스비 텍스트가 약간 덜 진해진 걸 발견했고, 텍스트 도중에 이중 헤더 또는 섹션 제목이 나타나는 현상을 관찰했어요.


새로운 시각적 변화 중에서는 일부가 약간 이상한 3D 효과를 나타내고, 두 번째 헤더는 데이터에 따라 다크 모드에서 더 나은 모습을 보였어요.


미래에는 안드로이드 15를 타겟팅하는 앱들이 베타 1부터 기본으로 에지를 표시할 것이고, 큰 화면에서 더 나은 시각적 경험을 제공할 예정이에요.


아직 이 변경사항을 지원하는 애플리케이션이 없지만, 향후 더 많은 앱 지원이 예상되고, 시간이 지날수록 더 많은 변화가 예정돼 있어요.



- Android 15 Beta 1에 미세한 변화는 무엇인가요?


Android 15 Beta 1에서는 예측 제스처에 미세한 변화가 있었어요.


대부분의 애플리케이션에서 널리 사용되지 않는 예측 제스처에서 새로운 옵션이 '프레잉 카드'처럼 더 자연스러운 디자인으로 변화되었다고 해요.


그러나 이 변화를 확인하려면 대부분은 개발자 옵션으로 이동하여 활성화해야 합니다.


Android 15 Beta 1에서는 그 외에 큰 변화보다는 이런 미세한 변화가 중심이었어요.


Android 15 Developer Preview 2

 


- Android 15 개발자 미리보기 2 업데이트의 핵심은?


구글이 Android 15 개발자 미리보기 2 업데이트를 공개했고, 유용한 추가 기능이 포함되었어요.


Android 15 중요 사용자 관련 변경 사항을 살펴보면, 새로운 오디오 공유 메뉴와 다운로드된 앱을 디바이스에 보관할 수 있는 기능이 주목할 만 합니다.


앱 정보 페이지의 '앱 열기' 버튼 옆에 '아카이브된' 앱이 위치하며, 홈 화면에서 회색으로 표시되어 Play Store에서 아이콘을 탭하여 다시 다운로드할 수 있어요.


픽셀을 웹캠으로 사용할 때 고품질 토글을 사용할 수 있으며, 비디오를 밝고 조금 더 선명하게 제공한다고 하네요.


또한, 개발자 미리보기 2에서 사소한 디자인 변경 사항이 소개되었지만 크게 변한 것은 없어요.


사용자에게 노출된 모든 변경 사항을 다룬 후, 더 많은 변경 사항에 대해 이야기할 예정이라고 해요.



- Android 15의 개발자 기능 기능성은?


Android 15에서 개발자가 이용할 수 있는 기술적 측면은 덮개가 있는 플리파블 기기에 대한 앱 호환성 선언이에요.


또한, 위성 연결도 주요 관심 사항 중 하나로 Android 15에서는 사용 중일 때의 새로운 상태 표시줄 아이콘 및 메시지 및 작동 방식에 대한 정보를 간단히 볼 수 있는 알림을 제공해요.


또한, SMS, MMS 및 RCS 메시징과 같은 앱은 위성 연결 기능을 활용하여 더 부드러운 사용자 경험을 제공할 수 있어요.


또한, 앱이 차가운, 따뜻한 또는 뜨거운 상태로 시작되었는지 추적할 수 있으며 앱이 다양한 출처에서 시작되었는지 확인할 수 있는 새로운 도구를 제공해요.


마지막으로, 앱이 화면 녹화 중인지 감지하고 사용자에게 알릴 수 있으며 NFC의 개선을 통해 더욱 원활한 탭하여 지불 트랜잭션을 제공해요.



- PDF 향상 기능과 안드로이드 15 업데이트의 주요 내용은?


앱에서 암호 보호된 파일, 주석, 양식 편집, 복사 검색 선택 등이 가능한 PDF 향상 기능이 곧 출시될 거예요.


기존 기능을 보완하는 주요 개발자 중점 기능 외에도 기술적인 내용은 링크로 안내되며, 안드로이드 15 설치를 원하는 경우 9to5Google 웹사이트에서 안내가 가능해요.


사용자 간의 큰 변경점이 많지 않아서 지금 안드로이드 15를 설치하는 건 권장되지 않지만, 개발자 중점 기능은 앞으로의 안드로이드 버전을 기대하게 만들어요.


2023년 7월 2일 일요일

경주 주상절리

경주여행 - 주상절리

경주하면 떠오르는 대표 관광지 중 하나인 주상절리는 용암이 빠르게 식으면서 기둥 모양으로 굳어진 지형입니다.

 

 제주도나 울릉도 등 다른 지역에서도 주상절리를 볼 수 있지만 경주의 주상절리는 독특한 형태로도 유명한데요. 부채꼴 모양의 주상절리가 특히 유명하답니다.

이번 주말엔 가족과 함께 경주 주상절리 구경하러 떠나보는건 어떨까요?

 

 

사진제공 - 경주시 관광자원 영상이미지
(https://www.gyeongju.go.kr/gyeongjuimage/page.do?cmd=2&mnu_uid=2440&con_uid=4199)

 

주상절리는 어떻게 만들어지나요? 주상절리는 화산활동시 분출되는 뜨거운 용암이 지표면에 흘러내리면서 급격히 식어서 만들어진 육각형 또는 사각형 돌기둥을 말합니다. 이러한 절리(틈)들이 수직방향으로 발달하면서 형성되는데요. 이 때 암석이 냉각될 때 부피가 수축되면서 사이사이에 틈이 생기게 됩니다. 그리고 오랜 시간동안 풍화작용을 거치면 균열이 생긴 암석 조각들이 떨어져 나가면서 지금의 모습처럼 멋진 주상절리를 이루게 된답니다.


경주의 주상절리는 어떤 특징이 있나요? 앞서 말했듯이 경주의 주상절리는 특이한 형태로도 유명한데요. 위 사진 속 부채꼴 모양의 주상절리가 보이시나요?

이렇게 큰 규모의 부채꼴 모양의 주상절리는 국내에서는 유일하게 경주에서만 볼 수 있다고 합니다. 또한 바다 근처에 위치해서 파도소리길이라는 산책로를 걸으며 아름다운 자연경관을 감상할 수 있답니다.


주변에 가볼만한 곳이 있나요? 부채꼴모양의 주상절리 뿐만 아니라 다양한 종류의 주상절리를 한 눈에 볼 수 있는 읍천항 벽화마을 추천드려요. 마을 곳곳에 그려진 예쁜 벽화들을 보며 걷다보면 마음속 힐링 제대로 느낄 수 있으실 꺼에요. 주변에 카페도 많으니 여유롭게 커피한잔 하며 둘러보는것도 좋을 것 같아요.


2019년 10월 10일 목요일

Android NDK


Android Studio 에서 App 빌드후 생성된 so ndk-build.cmd 생성한 so 파일의 크기가 다르다. 왜일까?
또한 ndk-build 이용해야 so libs 복사된다.(내부 install 명령을 통해서)

Android Studio Ndk-build 설정
File - Settings - Tools - External Tools - add

Build 추가
Program : sdk 설치폴더\ndk-bundle\ndk-build.cmd
Working dir : 프로젝트\app\src\main (or jni)

Clean 추가
Program : sdk 설치폴더\ndk-bundle\ndk-build.cmd
Arguments : clean
Working dir : 프로젝트\app\src\main (or jni)

 

 

[Build error : Error fatal error opening dependency file … No such file or directory]

D:/xxx/yyy/zzz/D_/build/xxx/yyy 형태로 중복 출력되는 경우

프로젝트의 경로가 너무 길어 발생하는 문제

 

2019년 8월 29일 목요일

Android Studio build error

  • java.lang.UnsatisfiedLinkError

Jni library를 추가 하거나, 빌드된 Library를 추가 했을 경우 아래와 같은 에러 발생
1. gradle.properties 파일  -> 아래 한 줄을 추가
   android.useDeprecatedNdk=true
2. app/build.gradle 파일 -> 아래 소스 추가
   defaultConfig {
        ndk {
            abiFilters "armeabi", "armeabi-v7a", "x86", "mips"
        }
    }

  • GCM java.io.IOException: SERVICE_NOT_AVAILABLE

시스템 환경설정 시간을 자동으로 설정

  • More than one file was found with OS independent path 'lib/armeabi-v7a/libxxx.so' 
해당 모듈의 build.gradle 에 추가.

 
packagingOptions {
    pickFirst 'lib/arm64-v8a/*'
    pickFirst 'lib/armeabi-v7a/*' 
}
 

2019년 7월 18일 목요일

Android SECRET_CODE

디버깅 로그 확인을 위해 SECRET_CODE 를 사용하였는데 언제부터인가 안되는 단말이 생기기 시작했다.
관련 내용을 정리해본다.

기본 dialer 앱을 통해 동작시켜야 한다.
*#*#code#*#* 이 동작하지 않을 경우는 adb 를 이용하는 방법도 있다.

adb shell am broadcast -a android.provider.Telephony.SECRET_CODE -d android_secret_code://codeNumber

but, Android Oreo(?) 이후부터는 exception 발생한다.
java.lang.SecurityException: Permission Denial: not allowed to send broadcast android.provider.Telephony.SECRET_CODE

API29 에서 ACTION_SECRET_CODE 가 생긴다는데 추후 확인 필요하다.

현재까지의 결론은, S 폰은 위 방법들로는 안되는거 같고, 내가 가지고 있는 일부 폰에서는 dialer app 에서는 동작은 한다.

Android Jetpack viewpager2

  Android Jetpack ViewPager2 기본 개념 및 샘플 코드 오늘은 안드로이드 개발에 있어서 굉장히 유용한 컴포넌트 중 하나인 ViewPager2에 대해 이야기해볼까 합니다. ViewPager2는 사용자 인터페이스에서 여러 화면을 좌우...