2013-03-18 1 views
2

Mark Murphy의 훌륭한 Commonsware 서적을 사용하고 있습니다. 나는 'FakePlayer'앱 (mp3 플레이어 인 척)을 만들었습니다. 여기에는 서비스가 포함되어 있습니다. 서비스를 확인 시작 - 그것은 잘 작동허가없이 서비스 의도를 시작할 수 없음 - 보낸 사람이 사용 권한을 얻지 못함

Intent i = new Intent(); 
i.setAction("com.example.cwfakeplayer.MyPlayerService"); 
Context context = getApplicationContext(); 
context.startService(i); 

가 : 학습 경험으로 나는 누구의 클릭 핸들러 않는 사소한 응용 프로그램을 (만 버튼이) 작성했습니다. 나는 이클립스는 서비스에 아무런 권한에 대해 불평 발견, 그래서 나는 2 선, 안드로이드 추가하여 서비스의 매니페스트를 업데이트 : 권한 및 안드로이드 : 수출 : 나는 장치에 플레이어 응용 프로그램을 다시로드

<service 
     android:name="MyPlayerService" 
     android:permission="com.example.fakeplayer.permission.MY_PLAYER_PERMISSION" 
     android:exported="true" 
     <intent-filter> 
      <action android:name="com.example.fakeplayer.MyPlayerService"></action> 
     </intent-filter> 
     </service> 

(내가 사용을 갤럭시 S2)를 사용하여 '디버그'를 이클립스합니다. 그것은 일하는 것처럼 보였다. 시동기 응용 프로그램이 내가 예상 한 허가 예외를 일으켰습니다.

그때 스타터 응용 프로그램의 매니페스트에 추가

(그것에게 권한을 부여하기 위해) :

<manifest 
    ... 
    <uses-sdk .... 
    .... 
    <uses-permission android:name="com.example.fakeplayer.permission.MY_PLAYER_PERMISSION" /> 

나는 (이클립스에서 디버깅을 사용) 장치에 스타터 응용 프로그램을 다시로드. 아직 시작 응용 프로그램에서 권한 오류가 발생합니다.

기기에서 앱을 모두 제거하고 다시 디버그 ...를 사용하여 서비스 앱을 시작한 다음 다시 시작합니다. 여전히 퍼머 오류가 발생합니다.

Murphy 씨의 고급 Android 책의 '원격 서비스 사용 방법'을 통해 진행 중이므로 앱에서 작동하는 가장 좋은 방법은 아닌 것을 깨달았습니다.

시동기 응용 프로그램에있는 'adb 셸 dumpsys 패키지'를 실행했는데 'permissionsFixed = false'및 'grantedPermissions'섹션이 없음을 발견했습니다. 필자는이 점을 고려하여 시작 앱의 변경 사항이 앱에 추가 된 파마를 관리하지 못했다는 의미입니다. 그러나 나는 이유를 모른다. 학습 경험으로서, 지금까지만 혼란이 발생했습니다 ....

모든 단서를 매우 높이 평가! 감사!

답변

3

자동으로 <service> 내보낼하게 <intent-filter>있는 것으로 android:exported="true"이 불필요, 기술적으로

를 수출했다.

기기에서 앱을 모두 제거하고 다시 디버그 ...를 사용하여 서비스 앱을 시작한 다음 다시 시작합니다. 여전히 퍼머 오류가 발생합니다.

<permission> 요소를 사용하여 사용자 지정 권한을 선언 한 위치를 표시하지 않습니다. 실제로 두 앱을 모두 관리하는 경우 동일한 <permission> 요소를 두 개의 매니페스트에 모두 넣어 두 앱의 설치 순서가 더 이상 중요하지 않습니다.

+0

처음에는 을 포함하는 데 도움이됩니다. 대답과 우수 도서 및 예제 코드에 감사드립니다. 을 사용하는 Android 북에서 예제 코드를 볼 수 없었으므로이 책을 간과했습니다. (이 장을 읽으면서 - 그러나 나는 '코드 중심'입니다.) –

+0

@ArtSwri : 글쎄, 당신이 분명히 읽고있는 책 ("고급 안드로이드")은 1 년 전에 그 책의 내용이 [내 주요 책] (http://commonsware.com)으로 접혀서 은퇴했다. ''요소를 플러그인 예에서 사용합니다 : https://github.com/commonsguy/cw-omnibus/tree/master/RemoteViews 그 말은 고마워요! – CommonsWare

+0

와우, 그쪽으로 멀어져있어. n 내 생각에 - 구독 정보가 없어졌습니다. 갱신을 위해 지금 남겨주세요 ... –

-1

는 매니페스트

<service android:name="com.example.fakeplayer.MyPlayerService"></service> 

대신

<service 
    android:name="MyPlayerService" 
    android:permission="com.example.fakeplayer.permission.MY_PLAYER_PERMISSION" 
    android:exported="true" 
    <intent-filter> 
     <action android:name="com.example.fakeplayer.MyPlayerService"></action> 
    </intent-filter> 
    </service> 

문제가 해결되지 않으면

, 친절하게 밖으로 게시 당신이 잘못을 교체하십시오. 권한 및 안드로이드 : 나는 2 선, 안드로이드를 추가하여 서비스의 매니페스트를 업데이트

+0

을 제거하면 기본값이 false로 설정되어 서비스가 포함 된 앱 외부에서 표시되지 않는다는 것을 이해할 수 있습니다. 그래서 내가 예상했던 것 : 시작 응용 프로그램의 startService()는 아무 것도하지 않습니다. Intent를 처리 할 수있는 아무 것도 보이지 않습니다. (버튼 클릭 방식의 Log.d 외에도 로그에는 아무 것도 없습니다. 노력에 감사하지만 실제로 해결책이라고 생각하지 마십시오. –