用相机拍照 Samsung galaxy s5 destroy activity

Take Photo with Camera Samsung galaxy s5 destroy activity

我正在开发使用 ImageView 显示照片的应用程序。但是拍摄照片后,它不会显示在 ImageView 中。此外,应用程序会在拍照后强制关闭。我用我的 Nexus 5 (Marshmallow)、Samsung Galaxy S4(Lollipop & CustomRom)、Xiaomi Mi4、Asus Zenfone 1 和 Lenovo 平板电脑尝试了这个 运行。以下是我在 Samsung Galaxy S5 上尝试过的一些场景:

代码如下:

AndroidManifest.xml

 <application
    android:name=".coreclass.CoreApp"
    android:allowBackup="true"
    android:hardwareAccelerated="true"
    android:icon="@mipmap/unik_fintech"
    android:label="@string/appname"
    android:largeHeap="true"
    android:launchMode="singleInstance"
    android:noHistory="true"
    android:theme="@style/Theme.MyTheme"
    tools:replace="android:label">
    <activity
        android:name=".activities.MainPage"
        android:configChanges="screenSize|keyboardHidden|orientation"
        android:exported="true"
        android:screenOrientation="portrait"
        android:windowSoftInputMode="stateAlwaysHidden">
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />

            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>
    <activity android:name=".activities.KantinActivity"
        android:configChanges="screenSize|keyboardHidden|orientation"
        android:screenOrientation="portrait"
        android:windowSoftInputMode="stateAlwaysHidden|adjustPan"
        />

KantinActivity.java

 @Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    Timber.d("isi request code:" + String.valueOf(requestCode));
    Timber.d("isi result Code:"+ String.valueOf(resultCode));
    super.onActivityResult(requestCode, resultCode, data);

    switch(requestCode) {
        case RESULT_GALERY:
            if(resultCode == RESULT_OK){
                Fragment currentFrag = getSupportFragmentManager().findFragmentById(R.id.kantinActivityContent);
                if(currentFrag instanceof StockBarangAction){
                    Bitmap photo = null;
                    Uri _urinya = data.getData();
                    if(data.getData() == null) {
                        photo = (Bitmap)data.getExtras().get("data");
                    } else {
                        try {
                            photo = MediaStore.Images.Media.getBitmap(getContentResolver(), data.getData());
                        } catch (IOException e) {
                            e.printStackTrace();
                        }
                    }
                    GeneralizeImage mGI = new GeneralizeImage(this,photo,_urinya);
                    StockBarangAction mFrag = (StockBarangAction) currentFrag;
                    mFrag.setFileImageCatalog(false, mGI.Convert(), _urinya.toString());
                }

            }
            break;
        case RESULT_CAMERA:
            if(resultCode == RESULT_OK && mCapturedImageURI!=null){
                Fragment currentFrag = getSupportFragmentManager().findFragmentById(R.id.kantinActivityContent);
                if(currentFrag instanceof StockBarangAction){
                    String[] projection = {MediaStore.Images.Media.DATA};
                    Cursor cursor = getContentResolver().query(mCapturedImageURI, projection, null, null, null);
                    String filePath;
                    if (cursor != null) {
                        cursor.moveToFirst();
                        int column_index_data = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
                        filePath = cursor.getString(column_index_data);
                    }
                    else
                        filePath = data.getData().getPath();
                    GeneralizeImage mGI = new GeneralizeImage(this,filePath);
                    StockBarangAction mFrag = (StockBarangAction) currentFrag;
                    mFrag.setFileImageCatalog(true, mGI.Convert(), filePath);
                    if (cursor != null) {
                        cursor.close();
                    }
                }
            }
            else{
                Toast.makeText(this, "Try Again", Toast.LENGTH_LONG).show();
            }
            break;
        default:
            break;
    }
}

@Override
protected void onSaveInstanceState(Bundle outState) {
    super.onSaveInstanceState(outState);
    if (mCapturedImageURI != null) {
        outState.putString("cameraImageUri", String.valueOf(mCapturedImageURI));
    }
}

@Override
protected void onRestoreInstanceState(Bundle savedInstanceState) {
    super.onRestoreInstanceState(savedInstanceState);
    if (savedInstanceState.containsKey("cameraImageUri")) {
        mCapturedImageURI = Uri.parse(savedInstanceState.getString("cameraImageUri"));
    }
}
public void setmCapturedImageURI(Uri _uri) {
    mCapturedImageURI = _uri;
}

StockBarangAction.java

private void chooseCamera() {
    if (reqPermissionClass.checkPermission(Manifest.permission.CAMERA, ReqPermissionClass.PERMISSIONS_REQ_CAMERA)) {
        runCamera();
    }
}

public void runCamera(){
    String fileName = "temp.jpg";

    ContentValues values = new ContentValues();
    values.put(MediaStore.Images.Media.TITLE, fileName);

    mCapturedImageURI = getActivity().getContentResolver().insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, values);

    KantinActivity parent = (KantinActivity) getActivity();
    parent.setmCapturedImageURI(mCapturedImageURI);

    Intent takePictureIntent = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE);
    takePictureIntent.putExtra(MediaStore.EXTRA_OUTPUT, mCapturedImageURI);
    getActivity().startActivityForResult(takePictureIntent, KantinActivity.RESULT_CAMERA);
}

@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
    super.onRequestPermissionsResult(requestCode, permissions, grantResults);
    if (reqPermissionClass.checkOnPermissionResult(requestCode,grantResults,
            ReqPermissionClass.PERMISSIONS_REQ_WRITEEXTERNALSTORAGE)||
            reqPermissionClass.checkOnPermissionResult(requestCode,grantResults,
                    ReqPermissionClass.PERMISSIONS_REQ_CAMERA)) {
        chooseCamera();
    }
    else {
        Toast.makeText(getActivity(), getString(R.string.cancel_permission_read_contacts), Toast.LENGTH_SHORT).show();
    }
}

public void setFileImageCatalog(boolean isCamera, File mFile, String imageContent) {
    mFileImageCatalog = mFile;

    Picasso mPic;
    if(MyApiClient.PROD_FLAG_ADDRESS)
        mPic = MyPicasso.getImageLoader(getActivity());
    else
        mPic= Picasso.with(getActivity());
    if(mFileImageCatalog != null){
        if(isCamera) {
            mPic.load(new File(imageContent))
                    .error(R.drawable.icon_no_photo)
                    .placeholder(R.drawable.progress_animation)
                    .fit()
                    .centerInside()
                    .into(img_catalog);
        }else
            mPic.load(imageContent)
                    .error(R.drawable.icon_no_photo)
                    .fit()
                    .centerInside()
                    .placeholder(R.drawable.progress_animation)
                    .into(img_catalog);
    }
}

StockBarangAction.java 是调用 Intent 相机的片段,结果由 KantinActivity(Extend BaseActivity) 捕获,其中图像使用 "GeneralizeImage" 函数调整大小,然后使用 [=48= 发送回片段] 函数。

我想知道的是:

谢谢你,对不起我的英语。

最有可能的是,当您的应用程序处于后台时,您的进程正在终止。这是完全正常的。您将在需要时获得全新的流程,并且用户可能会返回到他们之前使用的任何 activity。

您的应用需要处理这种情况,因为它不仅会在您拍照时发生——也可能由于其他原因发生:

  • 用户在您的应用程序中
  • 用户按下主页
  • 五分钟后,Android 终止您的进程以释放系统 RAM 供其他进程使用
  • 两分钟后,用户返回到您的应用(主屏幕启动器图标、overview/recent-tasks 屏幕等)

does camera app samsung galaxy s5 really have problem ?

没有

Do i need to save the textview instance ?

那是不可能的。