代码之家  ›  专栏  ›  技术社区  ›  Einzig7

应用程序在捕获图像后关闭,图像无法存储到FireBase

  •  0
  • Einzig7  · 技术社区  · 8 年前

    我正在开发一个应用程序,它使用FireBase身份验证通过电话号码登录用户。登录后,相机将打开,用户可以拍摄存储到FireBase的照片。但是,当我拍摄照片并点击OK时,应用程序关闭。互联网上有很多类似的问题,我试着解决每一个问题,但没有什么能解决我的问题。请建议在这里解决。

    这是activity.java的代码:

        private Button tapCameraBtn;
        private static final int CAMERA_REQUEST_CODE = 1;
    
        private StorageReference storageReference;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_add_contact);
            this.getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,WindowManager.LayoutParams.FLAG_FULLSCREEN);
    
            //referencing the storage directory
            tapCameraBtn = (Button) findViewById(R.id.tapCameraBtn);
    
            tapCameraBtn.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
    
                    Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
                    startActivityForResult(intent, CAMERA_REQUEST_CODE);
    
                }
            });
    
        }
    
        @Override
        protected void onActivityResult(int requestCode, int resultCode, Intent data) {
            super.onActivityResult(requestCode, resultCode, data);
    
            if(requestCode == CAMERA_REQUEST_CODE && resultCode == RESULT_OK && data!= null){
    
                Uri uri = data.getData();
    
                storageReference = FirebaseStorage.getInstance().getReference();
                //creating another storage reference for filepath
                StorageReference filepath = storageReference.child("Photos").child(uri.getLastPathSegment());
    
                //uploading image captuured to firebase
                filepath.putFile(uri).addOnSuccessListener(new OnSuccessListener<UploadTask.TaskSnapshot>() {
                    @Override
                    public void onSuccess(UploadTask.TaskSnapshot taskSnapshot) {
    
                        Toast.makeText(AddContactActivity.this, "Uploading finished!", Toast.LENGTH_LONG).show();
                    }
                });
    
    
            }
    
        }
    }
    

    清单文件在此处:

    <uses-permission android:name="android.permission.INTERNET"/>
    <uses-permission android:name="android.permission.CAMERA"/>
    
    <application
        android:allowBackup="true"
        android:icon="@drawable/app_icon"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
        <activity
            android:name=".SplashActivity"
            android:theme="@style/Theme.AppCompat.Light.NoActionBar">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
    
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <activity
            android:name=".AuthActivity"
            android:theme="@style/Theme.AppCompat.NoActionBar" />
        <activity android:name=".APIActivity" android:parentActivityName=".GestureActivity"/>
        <activity android:name=".GestureActivity" android:theme="@style/Theme.AppCompat.NoActionBar" />
        <activity android:name=".AddContactActivity" android:theme="@style/Theme.AppCompat.NoActionBar"></activity>
    </application>
    

    此外,我还允许在我的设备中使用相机。

    这里有一点更新,这个应用现在正在运行,但是在一个使用api 21的设备上,但是当我尝试在另外三个api 21以上的设备上运行同一个应用时,它给了我下面提到的错误:

    致命异常:主 进程:com.example.pooja.auxilio,PID:17109 java.lang.runtimeexception:未能将结果resultinfo who=null,request=1,result=-1,data=intent act=inline data(has extras)传递到activity com.example.pooja.auxilio/com.example.pooja.auxilio.addcontactactivity:java.lang.illegalargumentexception:uri不能为空 在安卓.App.ActuviyToel.Delvices结果(ActuviyToel.java:4173) 在安卓.App.ActuviyTo.HouthLeNeMeREST(ActhviyToel.java:4216) 在安卓.App.ActuviyTrime.WrAP20(ActuviyTo.java) 在安卓.App.ActuviyT线$ H.HuffLeMeSeX(ActuviyTrim.java:1590) 在安卓.OS.Halder-Debug消息(HANDL.java:102) 在安卓.OS.Looper-Loo.(循环器.java:163) 在Addio.App.ActuviyTrime.Mead(ActuviyToel.java:6342) 在java. 在COM.Android .No.OS.ZyGoTynIt方法和AdjSculal.Run(ZyGoTynIt.java:880) 在COM.Android .No.OS.ZyGoTyIn.Mault(ZyGoTynIt.java:770) 原因:java.lang.IllegalArgumentException:uri不能为空 在com.google.android.gms.common.internal.preconditions.checkArgument(未知源) 在com.google.firebase.storage.storagereference.putfile(未知源) 在COM.示例.Poja.AuxiLo.AddioCistActudio.NoActuviyRESUTE(AddioTraceActudio . Java:104) Apdio.App.Activity .Debug活动性结果(Activity .java:7111) 在安卓.App.ActuviyToel.Delvices结果(ActuviyToel.java:4169) 在安卓.App.ActuviyTrime.HouthLeNeMeREST(ActhVythType,Java:4216) 在安卓.App.ActuviyTrime.WrAP20(ActuviyTo.java) 在安卓.App.ActuviyT线$ H.HoalMeMeSeX(ActuviyTrim.java:1590) 在安卓.OS.Halder-Debug消息(HANDL.java:102) 在安卓.OS.Looper-Loor(Looper-Java:163)中 在Addio.App.ActuviyTrime.Mead(ActuviyToel.java:6342) 在java. 在Android系统中。 在COM.Android .No.OS.ZyGoTeNIT.MUN(ZyGoTynIt.java:770)

    2 回复  |  直到 8 年前
        1
  •  1
  •   Einzig7    8 年前

    我终于找到了解决这个问题的方法:

    而不是使用:

    Uri uri = data.getData();
    

    用途:

     Uri uri = getImageUri(getApplicationContext(), photo);
    

    并在代码中包含此函数:

    public Uri getImageUri(Context inContext, Bitmap inImage) {
        ByteArrayOutputStream bytes = new ByteArrayOutputStream();
        inImage.compress(Bitmap.CompressFormat.JPEG, 100, bytes);
        String path = MediaStore.Images.Media.insertImage(inContext.getContentResolver(), 
        inImage, "Title", null);
        return Uri.parse(path);
    }
    
        2
  •  0
  •   akshay s    8 年前

    使用该权限而不是重试一次 <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />