本发明涉及Android平台技术领域,特别涉及一种基于Android平台解决集成了TabHost菜单的APP其子Activity调用拍照方法后不能返回结果并闪退的方法。
背景技术:
在Android平台上集成了TabHost菜单的APP,在其子Activity调用拍照方法时,容易导致接收不到拍照后返回的数据并闪退的问题;为了解决这个问题,需要借助MainActivity来启动拍照功能。
技术实现要素:
本发明解决的技术问题在于提供一种基于Android平台集成了TabHost菜单的APP其子Activity拍照后接收数据的方法;解决了拍照后不能接收到数据并闪退的问题。
本发明解决上述技术问题的技术方案是:
在集成了TabHost菜单的APP其子Activity调用拍照方法时,先在MainActivity中定义静态变量main,并在MainActivity的onCreate方法中初始化main为this,然后在子Activity调用拍照方法中使用MainActivity.main.startActivityForResult方法来启动拍照程序。从而解决了子Activity调用拍照方法后不能返回结果并闪退的问题。
所述的方法具体包括如下步骤:
步骤一、创建一个Android项目,并在MainActivity中集成TabHost菜单栏;
步骤二、在MainActivity中定义类型为MainActivity的静态变量main,并在在onCreate方法中初始化main为this;
步骤三、创建子Activity及带有Button的布局文件;
步骤四、在子Activity中初始化Button,并给其添加onClick方法;
步骤五、在onClick方法中创建跳转到拍照的Intent对象,然后使用使用MainActivity.main.startActivityForResult启动拍照程序;
步骤六、在MainActivity中覆写onActivityResult来接收返回的数据,而不是在子Activity中覆写,接收到数据后传递给子Activity;
步骤七、最后在AndroidManifest.xml中注册Activity及开通拍照所需的相关权限。
本发明的有益效果:当在集成了TabHost菜单的APP其子Activity调用拍照方法时,先在MainActivity中定义静态变量main,并在MainActivity的onCreate方法中初始化main为this,然后在子Activity调用拍照方法中使用MainActivity.main.startActivityForResult方法来启动拍照功能,从而达到接收到拍照返回数据的目的。有效解决解决了子Activity调用拍照方法后不能返回结果并闪退的问题。
附图说明
下面结合附图对本发明进一步说明:
图1为本发明的流程图。
具体实施方式
如图1所示,本发明采用如下步骤:
步骤一、创建一个Android项目,并在MainActivity中集成TabHost菜单栏; 如:
public class MainActivity extends AppCompatActivity implements TabHost.OnTabChangeListener {
/**底部导航*/
private NoDestroyFragmentTabHost tabHost;
@Override
public void onTabChanged(String tabId) {
TLog.log(TAG, "tabId=====" + tabId);
}
// tab跳转
public void onEventMainThread(ChangeTabEvent event) {
tabHost.setCurrentTab(event.getIndex());
}
}
步骤二、在MainActivity中定义类型为MainActivity的静态变量main,并在在onCreate方法中初始化main为this;如:
public static MainActivity main;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
main = this;
}
步骤三、创建子Activity及带有Button的布局文件;如:
public class ChildActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_ child);
}
}
布局文件activity_child.xml
<xml version="1.0" encoding="utf-8">
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >
<Button
android:id="@+id/btn_photo" android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:background="@mipmap/icon_ photo " />
<TextView
android:id="@+id/tv_result"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:gravity="center"/>
</LinearLayout>
步骤四、在子Activity中初始化Button,并给其添加onClick方法;如:
public class ChildActivity extends AppCompatActivity {
@InjectView(R.id.btn_photo)
protected Button mBtnPhoto;
@InjectView(R.id.tv_result)
protected TextView mTvResult;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_child);
//注册组件
ButterKnife.inject(this);
//初始化点击事件
initClick();
}
@Override
protected void initClick() {
mBtnPhoto.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
省略……
}
});
}
}
步骤五、在onClick方法中创建跳转到拍照的Intent对象,然后使用使用MainActivity.main.startActivityForResult启动拍照程序;如:
Intent intent = new Intent(ChildActivity.this,CaptureActivity.class);
intent.putExtra("from" , Constants.FROM_CHILD);
MainActivity.main.startActivityForResult(intent, Constants.REQUEST_SCAN_QRCODE);
步骤六、在MainActivity中覆写onActivityResult来接收返回的数据,而不是在子Activity中覆写,接收到数据后传递给子Activity;如:
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (resultCode == RESULT_OK) {
switch (requestCode) {
case Constants.REQUEST_SCAN_QRCODE:
processScanResult(data, this);
break;
}
}
}
//处理拍照结果
public void processScanResult(Intent data, Activity activity) {
if (data != null) {
String result = data.getStringExtra("result");
if (TextUtils.isEmpty(result)) {
AppContext.showToast(“unknown error”));
return;
}
Intent intent = new Intent(activity, ChildActivity.class);
intent.putExtra(Constants.SCAN_RESULT, result);
activity.startActivity(intent);
}
}
步骤七、最后在AndroidManifest.xml中注册Activity及开通拍照所需的相关权限。如:
注册activity
<activity
android:name=".ui.MainActivity"
android:screenOrientation="portrait"
android:launchMode="singleTask"
android:theme="@style/AppTheme.NoActionBar" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity
android:name=".ui.ChildActivity"
android:screenOrientation="portrait"
android:theme="@style/AppTheme.NoActionBar" />
权限开通
<uses-permission android:name="android.permission.CAMERA" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-feature android:name="android.hardware.camera2.full" />
<uses-feature android:name="android.hardware.camera" />
<uses-feature android:name="android.hardware.camera.autofocus" />。