2014-02-14 2 views
0

LiveCard에서 사진을 찍을 수있는 메뉴 옵션이있는 간단한 GDK 앱이 있습니다. 필자는 FileObserver를 사용하기 위해 설명서의 지침을 예제와 매우 유사하게 사용했습니다. 그러나 파일 쓰기가 끝나면 바인더에서 메서드를 호출하여 내 서비스로 보내려고 시도합니다.이 서비스는 RemoteView의 ImageView에 이미지 URI를 설정하려고 시도합니다. 의 AndroidManifest.xml에서 LiveCard 서비스에서 촬영 한 사진에 액세스하려고 할 때 IOException이 발생했습니다.

나는 다음과 같은 권한이 있습니다


<uses-permission android:name="android.permission.RECORD_AUDIO" /> 
<uses-permission android:name="android.permission.CAMERA" /> 
<uses-feature android:name="android.hardware.camera" android:required="true" /> 
<uses-feature android:name="android.hardware.camera.autofocus" /> 
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> 
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /> 

MenuActivity :


@Override 
public boolean onOptionsItemSelected(MenuItem item) { 
    switch (item.getItemId()) { 
     case R.id.add_photo: 
      startActivityForResult(new Intent(MediaStore.ACTION_IMAGE_CAPTURE), TAKE_PIC_REQ);      
      break; 
    } 
    return super.onOptionsItemSelected(item); 
} 

    ... 
    private void processPictureWhenReady(final String picturePath) { 
    final File pictureFile = new File(picturePath); 

    if (pictureFile.exists()) { 

     liveCardService.setPicture(picturePath); 
    } 
    ... 

LiveCardService :


public class CompPlayerBinder extends Binder { 


    public void setPlayerPicture(String picturePath) { 
     liveCard.unpublish(); 

     RemoteViews view = new RemoteViews(getPackageName(), R.layout.photo_layout); 

     view.setImageViewUri(R.id.the_photo, Uri.fromFile(new File(picturePath))); 
     liveCard.setViews(view); 

     Intent i = new Intent(CompPlayerService.this, MenuActivity.class); 
     i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK); 
     liveCard.setAction(PendingIntent.getActivity(Service.this, 0, i, 0)); 
     liveCard.publish(LiveCard.PublishMode.SILENT); 




    } 
    } 

나는 내가 사진을 찍을 수 있어요,하지만 난 받아 들일 누를 때, 나는

02-13 22 내 로그에 다음과 같은 예외를 얻을이 실행하면 : 25 : 53.750 576-3201을 /? E/CachedFilesManager : 파일

/mnt/sdcard/thumbnail_cache/t_thumb_20140213_222552_748.jpg 때 java.io.IOException에 변경 모드로 실패 : 작동 com.google.glass.fs.Filesystem.changeMode에서 을 할 수 없습니다 (기본 방법) (com.google.glass.util.CachedFilesManager.save (CachedFilesManager.java:433) , com.google.glass.camera.CameraUtils.saveThumbnailToCachedFiles (CameraUtils.java:76) (com.google.glass) camera.ApiTakePictureActivity $ 1.doInBackground (ApiTakePictureActivity.java:110) at com.google.glass.camera.ApiTakePictureActivity $ 1.doInBackground (ApiTakePictureActivity.java:105) android.os.Async 작업 $ 2.call (AsyncTask.java:273) at java.util.concurrent.FutureTask $ Sync.innerRun (FutureTask.java:305) at java.util.concurrent.FutureTask.run (FutureTask.java:137) java.util.concurrent.ThreadPoolExecutor.runWorker (ThreadPoolExecutor.java:1076)에서 java.util.concurrent.ThreadPoolExecutor에서 $ Worker.run (ThreadPoolExecutor.java:569) 에서 java.lang.Thread.run (Thread.java : 856)

+1

매니페스트에 올바른 권한이 있습니까? –

+0

예, 위의 내용을 참조하여 매니페스트에있는 권한을 포함하도록 수정했습니다. – Ben

답변

0

그냥 내 문제를 알아 냈습니다. MenuActivity에 대한 나침반 예제를 따랐습니다. 이 예에서 메뉴를 닫은 후에는 onActivityResult가 실행될 기회가 없으므로 활동이 완료됩니다.

@Override 
public void onOptionsMenuClosed(Menu menu) { 
    super.onOptionsMenuClosed(menu); 

    unbindService(mConnection); 

    // We must call finish() from this method to ensure that the activity ends either when an 
    // item is selected from the menu or when the menu is dismissed by swiping down. 
    finish(); 
} 

그래서 난 단지 다른 메뉴 옵션 메뉴의 활동을 닫은 사진이 처리되고 완료 할 때까지 실행하는 활동을두고있다 대신하는 일.

1

저는 현재 마지막으로 찍은 사진을 찍기위한 활동에서 콘텐츠 확인자를 사용하고 있습니다. 이것은 활동 코드이므로 라이브 카드를 조정해야 할 수도 있습니다.

여기서 더러운 프로젝트가 있습니다 https://github.com/silenz357/Glass "작동 중"입니다. 도움이 되었으면 좋겠어요

 String[] projection = new String[]{MediaStore.Images.ImageColumns._ID,MediaStore.Images.ImageColumns.DATA,MediaStore.Images.ImageColumns.BUCKET_DISPLAY_NAME,MediaStore.Images.ImageColumns.DATE_TAKEN,MediaStore.Images.ImageColumns.MIME_TYPE};     
    final Cursor cursor = getContentResolver().query(MediaStore.Images.Media.EXTERNAL_CONTENT_URI,projection, null, null, MediaStore.Images.ImageColumns.DATE_TAKEN + " DESC");     
    if(cursor != null){     
     cursor.moveToFirst(); 
     String path = cursor.getString(cursor.getColumnIndex(MediaStore.Images.ImageColumns.DATA));     t.setText(path); 
     ImageView imageView = (ImageView)findViewById(R.id.imageView1);  
        image = BitmapFactory.decodeFile(path);     
     int nh = (int) (image.getHeight() * (512.0/image.getWidth()));         
     Bitmap scaled = Bitmap.createScaledBitmap(image, 512, nh, true);      
     imageView.setImageBitmap(scaled); 
+0

답장을 보내 주셔서 감사합니다.하지만 문제가 해결되었습니다 (내 대답 참조). 그 외 모든 것은 문서에서 표준 예제를 사용하고 RemoteViews.setImageViewUri()를 호출하여 올바르게 작동합니다. – Ben

관련 문제