【问题标题】:Android Camera Video intent returns null URIAndroid 相机视频意图返回空 URI
【发布时间】:2014-04-21 14:03:35
【问题描述】:

我最近更新到了 Android 4.3,每当我从我的应用程序中使用 Intent 启动它时,股票摄像机开始表现得有些奇怪。

起初它会崩溃并说“画廊停止响应”。过了一会儿,我可以录制视频了,但是点击完成后,我的应用返回了一个空 URI,导致它崩溃了!

所以我开始使用相同的代码测试 2.3.4 设备。视频应用返回了我可以在该设备上使用的正确 URI。在我获得 4.3(拥有 4.2.2 库存 Galaxy Nexus)之前,相同的代码运行得非常好

这是一个从 4.3 的相机应用程序获取空 URI 但在 4.2.2 及更低版本的设备上正常工作的活动。

public class MainActivity extends Activity {

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    Button pick = (Button) findViewById(R.id.button1);
    pick.setOnClickListener(new OnClickListener() {

        @Override
        public void onClick(View v) {
            Intent takeVideoIntent = new Intent(MediaStore.ACTION_VIDEO_CAPTURE);
            startActivityForResult(takeVideoIntent, 123);
        }
    });
}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    // Inflate the menu; this adds items to the action bar if it is present.
    getMenuInflater().inflate(R.menu.main, menu);
    return true;
}

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    if(resultCode == RESULT_OK){
        if(requestCode == 123){
            VideoView videoView = (VideoView) findViewById(R.id.videoView1);
            videoView.setVideoURI(data.getData());
            Log.d("Video", "URI "+data.getData());
        }
    }
    super.onActivityResult(requestCode, resultCode, data);
}
}

我该怎么做才能让这种情况永远不会发生?这是否意味着这将与不同制造商设备上的其他相机应用程序的工作方式不同?

【问题讨论】:

    标签: android video camera nullpointerexception uri


    【解决方案1】:

    我通过将视频意图更改为以下内容来解决此问题:

    Intent intent = new Intent(MediaStore.ACTION_VIDEO_CAPTURE);
    String fName = "VideoFileName.mp4";
    File f = new File(fName);
    intent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(f));
    startActivityForResult(intent, CAMERA_VIDEO_REQUEST);
    

    在活动结果中我得到了视频文件路径如下:

    File f = new File(Environment.getExternalStorageDirectory().toString());
    for (File temp : f.listFiles()) {
         if (temp.getName().equals("VideoFileName.mp4")) {
             f = temp;
             break;
         }
    }
    //f is the video file...
    

    【讨论】:

    • 这个解决方案节省了我的时间@akshay。谢谢。
    【解决方案2】:

    这可能是相机应用程序中的错误,我通过检索最后拍摄的视频解决了它:

    Uri getLastPhotoOrVideo(Context context) {
        String[] columns = { MediaStore.MediaColumns.DATA, MediaStore.MediaColumns.DATE_ADDED };
    
        ContentResolver cr = context.getContentResolver();
        Cursor cursor = cr.query(MediaStore.Video.Media.EXTERNAL_CONTENT_URI, columns, null, null,
                MediaStore.MediaColumns.DATE_ADDED + " DESC");
    
        int columnIndex = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
        cursor.moveToFirst();
        String path = cursor.getString(columnIndex);
    
        cursor.close();
    
        return Uri.fromFile(new File(path));
    }
    

    【讨论】:

      【解决方案3】:

      在 Android 4.3 上,引入了权限。您需要以这种方式启动 Intent。请参阅此帖子进行更改:Android 4.3 behaviors

      您需要在 Android OS 4.3 及更高版本上以这种方式启动 Intent:

      Intent intent = new Intent(Intent.MediaStore.ACTION_VIDEO_CAPTURE);
      ...
      if (intent.resolveActivity(getPackageManager()) != null) {
          startActivity(intent);
      } else {
          Toast.makeText(context, R.string.app_not_available, Toast.LENGTH_LONG).show();
      }
      

      您还需要在清单文件中添加android:restrictedAccountType 标签:

      <application ...
          android:restrictedAccountType="com.example.account.type" >
      

      也阅读this

      【讨论】:

      • @akshaybhasme 请查看我编辑的帖子并阅读提供的链接以获取详细信息。
      • 我尝试了 Play 商店中的 Camera ICS 应用程序。该应用程序返回正确的 uri。我开始考虑这是否是 4.3 的库存 android 相机应用程序中的错误!!!
      • 是的。这不适用于定制相机甚至是运行 Android 4.3 的三星手机。我在 S3 和 Nexus 4 上试过。它只在 Nexus 4 上崩溃
      猜你喜欢
      • 1970-01-01
      • 2014-04-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多