当前位置: 首页 > 知识库问答 >
问题:

从相机上传照片时出错

夏侯和韵
2023-03-14

我是android studio和手机应用程序开发的初学者,但我仍在努力学习。因此,我设法构建了我的第一个webview应用程序来显示页面和图片。我发现了许多有用的资源来帮助我这样做,但我仍然面临着一个问题,即如何直接上传从手机摄像头(而不是从图库)拍摄的照片并上传到服务器。

1-在我按下眉毛按钮后,应用程序会提示我是从相机还是从画廊拍摄照片。(Android版9)2-当我从图库上传一张照片时,应用程序工作得很好,但当我使用相机拍摄一张照片并上传时,它就不工作了。尽管照片名返回到字段路径,但它会给出以下错误消息

下面是我的onActivityResult代码

    public void onActivityResult(int requestCode, int resultCode, Intent data) {
    if (Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP) {
        if (requestCode == FILECHOOSER_RESULTCODE) {
            if (null == this.mUploadMessage) {
                return;
            }
            Uri result = null;
            try {
                if (resultCode != RESULT_OK) {
                    result = null;
                } else {
                    // retrieve from the private variable if the intent is null
                    result = data == null ? mCapturedImageURI : data.getData();
                }
            } catch (Exception e) {
                Toast.makeText(getApplicationContext(), "activity :" + e, Toast.LENGTH_LONG).show();
            }

            mUploadMessage.onReceiveValue(result);
            mUploadMessage = null;
        }

    } 
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {

        if (requestCode != FILECHOOSER_RESULTCODE || mFilePathCallback == null) {
            super.onActivityResult(requestCode, resultCode, data);
            return;
        }

        Uri[] results = null;      
        if (resultCode == Activity.RESULT_OK) {
            if (data == null || data.getData() == null) {
                // if there is not data, then we may have taken a photo
                if (mCameraPhotoPath != null) {
                    results = new Uri[]{Uri.parse(mCameraPhotoPath)};
                }
            } else {
                String dataString = data.getDataString();
                if (dataString != null) {
                    results = new Uri[]{Uri.parse(dataString)};
                }
            }
        }

        mFilePathCallback.onReceiveValue(results);
        mFilePathCallback = null;

    } // end of code for Lollipop only
}

-----这是openFileChooser-----------------------------------------------

 public void openFileChooser(ValueCallback<Uri> uploadMsg, String acceptType) {
                mUploadMessage = uploadMsg;
                mWebView.getSettings().setJavaScriptEnabled(true);
                mWebView.getSettings().setAllowFileAccess(true);
                mWebView.getSettings().setPluginState(WebSettings.PluginState.ON);
                mWebView.getSettings().setDomStorageEnabled(true);
                mWebView.getSettings().setLoadsImagesAutomatically(true);

                try {
                    File imageStorageDir = new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES), "DirectoryNameHere");

                    if (!imageStorageDir.exists()) {
                        imageStorageDir.mkdirs();
                    }

                    File file = new File(imageStorageDir + File.separator + "IMG_" + String.valueOf(System.currentTimeMillis()) + ".jpg");

                    mCapturedImageURI = Uri.fromFile(file); // save to the private variable

                    final Intent captureIntent = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE);
                    captureIntent.putExtra(MediaStore.EXTRA_OUTPUT, mCapturedImageURI);
                    // captureIntent.putExtra(MediaStore.EXTRA_SCREEN_ORIENTATION, ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);

                    Intent i = new Intent(Intent.ACTION_GET_CONTENT);
                    i.addCategory(Intent.CATEGORY_OPENABLE);
                    i.setType("image/*");

                    Intent chooserIntent = Intent.createChooser(i, getString(R.string.image_chooser));
                    chooserIntent.putExtra(Intent.EXTRA_INITIAL_INTENTS, new Parcelable[]{captureIntent});

                    startActivityForResult(chooserIntent, FILECHOOSER_RESULTCODE);
                } catch (Exception e) {
                    Toast.makeText(getBaseContext(), "Camera Exception:" + e, Toast.LENGTH_LONG).show();
                }

            }
      
I really appreciate your help 

共有1个答案

史景铄
2023-03-14

仅仅放入清单还不够,必须启动requet权限,

if (ContextCompat.checkSelfPermission(this, 
    Manifest.permission.REQUESTED_PERMISSION) ==PackageManager.PERMISSION_GRANTED) 
{
    // You can use the API that requires the permission
    openFileChooser();
}else{
    requestPermissions(this,new String[] { 
        Manifest.permission.READ_EXTERNAL_STORAGE,
        Manifest.permission.WRITE_EXTERNAL_STORAGE,
        Manifest.permission.CAMERA},100
        );
}
@Override
public void onRequestPermissionsResults(
    int requestCode, String[] permissions,int[] grantResults) 
    {
    if (requestCode==100 && grantResults[0] == PackageManager.PERMISSION_GRANTED){
        openFileChooser();
    }else{
        //not grant show toas or dialog
    }
}
 类似资料:
  • 我已经处理了文件选择器,它完美地上传了文件, <罢工> 问题出在相机上。一旦我试图上传相机照片,它崩溃了。据我所知,这是因为URI。 a)文件选择器:内容://media/external/images/1234 b)摄像:文件:///mnt/sdcard/pic.jpg <罢工> 它现在崩溃了,因为在尝试上传“content://media/external/images/1234”时出现了nu

  • 我正在尝试允许用户用相机应用程序拍摄一张照片,然后在应用程序中显示它的预览。 我还需要在应用程序的稍后阶段访问该文件(但这不是一个问题) 我有以下崩溃: 完成时处理图像: 我不明白为什么它只是4.4.4的问题,而不是其他操作系统。 当出现崩溃时,它并没有说我的应用程序崩溃了,它说Camera已经停止工作了,并且我只能在没有过滤器的情况下查看日志时查看崩溃,这意味着崩溃不在我的应用程序中?

  • 我正在尝试从sdcard拍摄照片,它是工作的情况下,当用户选择从谷歌照片,但给出一个curserindexoutofbound错误时,从任何其他应用程序,如gallery或file Manager。这是一段代码。 OnActivity Result`{if(requestCode==PICK_IMAGE_REQUEST&&resultCode==activity.result_ok&data!=n

  • 我的MainActivity代码在这里:

  • 我无法将相机拍摄的照片发送到服务器。我一步一步地遵循了谷歌关于拍照的文档(https://developer.android.com/training/camera/photoBasics),但仍然无法做到这一点。从设备库上传文件似乎很好。另外,如果我录制了一个视频,上传将是美味的。 这是我的活动代码: 文件提供程序: FileUtils类(由方法getDataColumn引起的异常):

  • 我收到代码为200的响应,但图像没有上传到服务器