【问题标题】:IOException when trying to access photo taken by activity in LiveCard service尝试访问 LiveCard 服务中的活动拍摄的照片时出现 IOException
【发布时间】:2014-02-14 06:30:06
【问题描述】:

我有一个简单的 GDK 应用程序,它在 LiveCard 上有一个菜单选项来拍照。我已按照文档中的说明使用与那里的示例非常相似的 FileObserver。但是,一旦文件完成写入,我会尝试将活页夹中的一个方法调用到我的服务,然后它会尝试在 RemoteView 中的 ImageView 上设置图像 uri。

在 AndroidManifest.xml 我有以下权限:


<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" />

菜单活动:


   @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) 在 com.google.glass.camera.ApiTakePictureActivity$1.doInBackground(ApiTakePictureActivity.java:105) 在 android.os.AsyncTask$2.call(AsyncTask.java:273) 在 java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:305) 在 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)

【问题讨论】:

  • 您的清单中是否有正确的权限?
  • 是的,编辑了问题以包括我在清单中拥有的权限,见上文。

标签: android camera google-glass ioexception google-gdk


【解决方案1】:

我目前正在一个活动中使用内容解析器来抓取最后一张拍摄的照片。 这是针对活动编码的,因此您可能需要针对 livecard 进行调整。

这里有一个脏项目 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);

【讨论】:

  • 感谢您的回复,但事实证明问题出在其他问题上(请参阅我的回答)。现在使用文档中的标准示例并调用 RemoteViews.setImageViewUri(),其他所有内容都可以正常工作
【解决方案2】:

刚刚发现我的问题。我正在关注 MenuActivity 的 Compass 示例。在那个例子中,菜单关闭后,活动结束,因为这个 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();
}

所以我所做的只是关闭其他菜单选项的菜单活动,并让活动继续运行,直到处理完照片。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-11
    • 2017-08-12
    • 1970-01-01
    • 2011-07-25
    • 2011-03-30
    • 2011-04-10
    相关资源
    最近更新 更多