안드로이드 개발 질문/답변
(글 수 45,052)
안녕하세요.
안드로이드의 Launcher 소스를 분석중입니다.
여기서 위젯을 등록(?) 하는거 같은 코드가 있는데요.
원래 Launcher 의 소스로는 되지가 않아서,
AppWidgetManager 로 코드르 바꾸어서 테스트해 보았는데요.
java.lang.SecurityException:
bindGagetId appWidgetId=1000 provider=ComponentInfo{com.android.alarmclock/com.android.alarmclock.AnalogAppWidgetProvider}:
User 10024 does not have android.permission.BIND_APPWIDGET.
이런 에러가 나옵니다.
android.permission.BIND_APPWIDGET 권한은 어디에 주어야 하는 것인지요?
AndroidManifest.xml 에
<uses-permission android:name="android.permission.BIND_APPWIDGET" />
이것도 넣고,
<provider
android:name="LauncherProvider"
android:authorities="soludens.andr.launcher.launcherprovider"
android:writePermission="soludens.andr.launcher.permission.WRITE_SETTINGS"
android:readPermission="soludens.andr.launcher.permission.READ_SETTINGS"
android:permission="android.permission.BIND_APPWIDGET"/>
provider 옵션에도 넣었지만 동일한 에러가 나옵니다.
혹시 AppWidgetManager 사용법 예제 소스같은거 어디서 구할 수 없을 까요?
도움말만 보고, 아래와 같이 짜 보았는데 안되네요 ㅡ. ㅡ
final int[] bindSources = new int[] {
Favorites.ITEM_TYPE_WIDGET_CLOCK,
Favorites.ITEM_TYPE_WIDGET_PHOTO_FRAME,
};
final ArrayList<ComponentName> bindTargets = new ArrayList<ComponentName>();
bindTargets.add(new ComponentName("com.android.alarmclock",
"com.android.alarmclock.AnalogAppWidgetProvider"));
bindTargets.add(new ComponentName("com.android.camera",
"com.android.camera.PhotoAppWidgetProvider"));
launchAppWidgetBinder(bindSources, bindTargets);
private void launchAppWidgetBinder(int[] bindSources, ArrayList<ComponentName> bindTargets) {
AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(mContext);
for (int i = bindTargets.size() - 1 ; i >= 0; i--)
{
appWidgetManager.bindAppWidgetId(bindSources[i], bindTargets.get(i));
}
}
감사합니다.
안드로이드의 Launcher 소스를 분석중입니다.
여기서 위젯을 등록(?) 하는거 같은 코드가 있는데요.
원래 Launcher 의 소스로는 되지가 않아서,
AppWidgetManager 로 코드르 바꾸어서 테스트해 보았는데요.
java.lang.SecurityException:
bindGagetId appWidgetId=1000 provider=ComponentInfo{com.android.alarmclock/com.android.alarmclock.AnalogAppWidgetProvider}:
User 10024 does not have android.permission.BIND_APPWIDGET.
이런 에러가 나옵니다.
android.permission.BIND_APPWIDGET 권한은 어디에 주어야 하는 것인지요?
AndroidManifest.xml 에
<uses-permission android:name="android.permission.BIND_APPWIDGET" />
이것도 넣고,
<provider
android:name="LauncherProvider"
android:authorities="soludens.andr.launcher.launcherprovider"
android:writePermission="soludens.andr.launcher.permission.WRITE_SETTINGS"
android:readPermission="soludens.andr.launcher.permission.READ_SETTINGS"
android:permission="android.permission.BIND_APPWIDGET"/>
provider 옵션에도 넣었지만 동일한 에러가 나옵니다.
혹시 AppWidgetManager 사용법 예제 소스같은거 어디서 구할 수 없을 까요?
도움말만 보고, 아래와 같이 짜 보았는데 안되네요 ㅡ. ㅡ
final int[] bindSources = new int[] {
Favorites.ITEM_TYPE_WIDGET_CLOCK,
Favorites.ITEM_TYPE_WIDGET_PHOTO_FRAME,
};
final ArrayList<ComponentName> bindTargets = new ArrayList<ComponentName>();
bindTargets.add(new ComponentName("com.android.alarmclock",
"com.android.alarmclock.AnalogAppWidgetProvider"));
bindTargets.add(new ComponentName("com.android.camera",
"com.android.camera.PhotoAppWidgetProvider"));
launchAppWidgetBinder(bindSources, bindTargets);
private void launchAppWidgetBinder(int[] bindSources, ArrayList<ComponentName> bindTargets) {
AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(mContext);
for (int i = bindTargets.size() - 1 ; i >= 0; i--)
{
appWidgetManager.bindAppWidgetId(bindSources[i], bindTargets.get(i));
}
}
감사합니다.
2009.10.20 20:56:10
Launcher 에서 사용하는 code 부분은 System Framework 부분이 아닌 package 영역이라 안될껍니다 :)
실례로 HomeScreen 에 Widget을 넣는 예제의 경우 appWidgetProvider 와 RemoteView를 이용해서 하게되구요.
SDK 상으로 개발은 그렇습니다.
풀소스 건드리면 다른방법도 되지만서도요 ^^;
위젯 제작의 예시는
http://android-developers.blogspot.com/2009/04/introducing-home-screen-widgets-and.html
위 링크를 참조해보세요
2009.10.20 21:22:24
답변 감사드립니다.
링크의 글은 이미 본 글인데요.
제가 하고 싶은 것을 위젯을 만들려는 것이 아니고,
Home 처럼 다른 사람이 만든 위젯을 사용하려고 하는 것입니다.
정확히는 Home의 UI를 완전히 바꾸어서 새롭게 만들어보려고 하는데요.
UI는 바뀌더라도 기존 위젯기능은 지원해야 될듯하여, Launcher의 소스를 가져다가 테스트 중인데
저 에러나 나오더라구요. ^^
링크의 글은 이미 본 글인데요.
제가 하고 싶은 것을 위젯을 만들려는 것이 아니고,
Home 처럼 다른 사람이 만든 위젯을 사용하려고 하는 것입니다.
정확히는 Home의 UI를 완전히 바꾸어서 새롭게 만들어보려고 하는데요.
UI는 바뀌더라도 기존 위젯기능은 지원해야 될듯하여, Launcher의 소스를 가져다가 테스트 중인데
저 에러나 나오더라구요. ^^
2009.10.21 13:10:11
Home의 기능을 새롭게 구현하려고 하시면, API Demo의 Home Screen 데모를 한번 살펴보시면 좋을듯도 싶습니다 :)
기존 Launcher 코드를 사용하시려면 SDK 개발상으로는 제한사항이 많아서요 :)
아니시면 풀소스 내에서 빌드 환경 셋팅하시고 개발하는것도 괜찮을듯 싶네요 :)
2009.10.21 16:44:21
android.permission.BIND_APPWIDGET permission은 일반 user process는 가질수 없는 permission입니다.
실제 구현상에서도 appWidgetManager.bindAppWidgetId() 함수를 호출하는 process는 android Settings가 하고 있지요.
위의 Launcher에서 사용하는 코드는 최초 실행할 때 기본적으로 배치되는 item을 appWidget으로 하려고 할때 Settings와 연계해서
작업하는 코드입니다.
사용자가 직접 app widget을 추가하는 경우는 Framework에서 자동으로 bind 해주기 때문에 appWidget id만 받아서 하실 수 있습니다.
실제 구현상에서도 appWidgetManager.bindAppWidgetId() 함수를 호출하는 process는 android Settings가 하고 있지요.
위의 Launcher에서 사용하는 코드는 최초 실행할 때 기본적으로 배치되는 item을 appWidget으로 하려고 할때 Settings와 연계해서
작업하는 코드입니다.
사용자가 직접 app widget을 추가하는 경우는 Framework에서 자동으로 bind 해주기 때문에 appWidget id만 받아서 하실 수 있습니다.