[Android] 调用第三方app(未知包名情况)
2019-03-04 本文已影响0人
闭门造折
毕设需要实现一个app,暂且称为MyApp
其中有一个功能是调用另一个相机配套app(称为CameraApp好了)进行拍照
在网上查找了如何在一个app中调用另一个app
参考资料:《Android APP打开另一个APP完整逻辑实现》
这篇文章很详细的说明了如何调用。
但是第三方app存在两个问题
1:如果该app很有名,如高德地图等,网上就可以找到他们的包名、scheme等信息调用即可。但是如果该app很冷门,如我们使用的相机配套app,得不到包名,最简单的通过包名调用的方法就暂时失败了。
2:有的方法中说可以实现隐式调用,但是第三方软件我们无法直接对原app进行修改
最终决定从问题1入手,通过反编译的方式,获取apk的包名(这个过程意外的简单)
参考资料:《Android APK反编译 apktool使用教程》
按照里面的步骤,首先下载一个jar文件和一个bat文件,然后放在C://windows下
通过cmd打开到apk所在位置,运行指令
apktool d apk的名字.apk
我们就会得到很多的文件,打开AndroidMenifest.xml,看到如下内容(截取有效内容)
<?xml version="1.0" encoding="utf-8" standalone="no"?>
<manifest
xmlns:android="http://schemas.android.com/apk/res/android"
package="com.wifidevice.coantec.activity">
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/>
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE"/>
<application android:allowBackup="true" android:icon="@drawable/yaya" android:label="@string/app_name" android:theme="@style/AppTheme">
<activity android:configChanges="keyboard|keyboardHidden|orientation|screenSize" android:name="com.methnm.coantec.activity.MainActivity" android:screenOrientation="landscape" android:theme="@android:style/Theme.Black.NoTitleBar.Fullscreen">
<intent-filter>
<action android:name="android.intent.action.MAIN"/>
<category android:name="android.intent.category.LAUNCHER"/>
</intent-filter>
</activity>
<activity android:name="com.methnm.coantec.activity.Home" android:screenOrientation="landscape" android:theme="@android:style/Theme.Light.NoTitleBar.Fullscreen"/>
<activity android:name="com.methnm.coantec.activity.FileActivity" android:screenOrientation="landscape" android:theme="@android:style/Theme.Light.NoTitleBar.Fullscreen"/>
<activity android:name="com.methnm.coantec.activity.PhotoGridviewActivity" android:screenOrientation="landscape" android:theme="@android:style/Theme.Light.NoTitleBar.Fullscreen"/>
很清晰地看到,package的名字为"com.wifidevice.coantec.activity"
主类的名字为“com.methnm.coantec.activity.MainActivity”
重新找到上面进行包名app调用的教程,照葫芦画瓢进行调用(我的app中是给调用操作绑定了一个按钮)
// 调用拍照按钮
Button cameraButton = (Button) findViewById(R.id.camera_button);
cameraButton.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
Log.d(TestLog, "Took photo");
Intent intent = new Intent();
//包名 包名+类名(全路径)
ComponentName comp = new ComponentName("com.wifidevice.coantec.activity","com.methnm.coantec.activity.MainActivity");
intent.setComponent(comp);
intent.setAction("android.intent.action.MAIN");
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);
}
});
运行测试一下,成功!
中途其实还是失败了一小下的,我原以为主类的前半段com.methnm.coantec.activity就是包名,所以Android一直提示找不到对应的app,改进后就直接通过了