我正在使用android-python27项目,以便通过我的apk执行python脚本,我想将自己已经完成的应用程序与它合并。
首先在android-python项目中有这个活动:
package com.android.python27;
import com.android.python27.config.GlobalConstants;
import com.android.python27.support.Utils;
import com.googlecode.android_scripting.FileUtils;
import java.io.File;
import java.io.InputStream;
import android.util.Log;
import android.app.Activity;
import android.app.ProgressDialog;
import android.content.Intent;
import android.content.res.Resources;
import android.os.AsyncTask;
import android.os.Bundle;
import android.os.Environment;
import android.os.Handler;
import android.os.Message;
import android.view.View;
import android.widget.Button;
import android.widget.Toast;
public class ScriptActivity extends Activity {
ProgressDialog myProgressDialog;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// mounted sdcard ?
//if (!Environment.getExternalStorageState().equals("mounted")) {
// Log.e(GlobalConstants.LOG_TAG, "External storage is not mounted");
//
// Toast toast = Toast.makeText( getApplicationContext(), "External storage not mounted", Toast.LENGTH_LONG);
// toast.show();
// return;
//}
// install needed ?
boolean installNeeded = isInstallNeeded();
if(installNeeded) {
setContentView(R.layout.install);
new InstallAsyncTask().execute();
}
else {
runScriptService();
finish();
}
//onStart();
}
private void sendmsg(String key, String value) {
Message message = installerHandler.obtainMessage();
Bundle bundle = new Bundle();
bundle.putString(key, value);
message.setData(bundle);
installerHandler.sendMessage(message);
}
final Handler installerHandler = new Handler() {
@Override
public void handleMessage(Message message) {
Bundle bundle = message.getData();
if (bundle.containsKey("showProgressDialog")) {
myProgressDialog = ProgressDialog.show(ScriptActivity.this, "Installing", "Loading", true);
}
else if (bundle.containsKey("setMessageProgressDialog")) {
if (myProgressDialog.isShowing()) {
myProgressDialog.setMessage(bundle.getString("setMessageProgressDialog"));
}
}
else if (bundle.containsKey("dismissProgressDialog")) {
if (myProgressDialog.isShowing()) {
myProgressDialog.dismiss();
}
}
else if (bundle.containsKey("installSucceed")) {
Toast toast = Toast.makeText( getApplicationContext(), "Install Succeed", Toast.LENGTH_LONG);
toast.show();
}
else if (bundle.containsKey("installFailed")) {
Toast toast = Toast.makeText( getApplicationContext(), "Install Failed. Please check logs.", Toast.LENGTH_LONG);
toast.show();
}
}
};
public class InstallAsyncTask extends AsyncTask<Void, Integer, Boolean> {
@Override
protected void onPreExecute() {
}
@Override
protected Boolean doInBackground(Void... params) {
Log.i(GlobalConstants.LOG_TAG, "Installing...");
// show progress dialog
sendmsg("showProgressDialog", "");
sendmsg("setMessageProgressDialog", "Please wait...");
createOurExternalStorageRootDir();
// Copy all resources
copyResourcesToLocal();
// TODO
return true;
}
@Override
protected void onProgressUpdate(Integer... values) {
}
@Override
protected void onPostExecute(Boolean installStatus) {
sendmsg("dismissProgressDialog", "");
if(installStatus) {
sendmsg("installSucceed", "");
}
else {
sendmsg("installFailed", "");
}
runScriptService();
finish();
}
}
private void runScriptService() {
if(GlobalConstants.IS_FOREGROUND_SERVICE) {
startService(new Intent(this, ScriptService.class));
}
else {
startService(new Intent(this, BackgroundScriptService.class));
}
}
private void createOurExternalStorageRootDir() {
Utils.createDirectoryOnExternalStorage( this.getPackageName() );
}
// quick and dirty: only test a file
private boolean isInstallNeeded() {
File testedFile = new File(this.getFilesDir().getAbsolutePath()+ "/" + GlobalConstants.PYTHON_MAIN_SCRIPT_NAME);
if(!testedFile.exists()) {
return true;
}
return false;
}
private void copyResourcesToLocal() {
String name, sFileName;
InputStream content;
R.raw a = new R.raw();
java.lang.reflect.Field[] t = R.raw.class.getFields();
Resources resources = getResources();
boolean succeed = true;
for (int i = 0; i < t.length; i++) {
try {
name = resources.getText(t[i].getInt(a)).toString();
sFileName = name.substring(name.lastIndexOf('/') + 1, name.length());
content = getResources().openRawResource(t[i].getInt(a));
content.reset();
// python project
if(sFileName.endsWith(GlobalConstants.PYTHON_PROJECT_ZIP_NAME)) {
succeed &= Utils.unzip(content, this.getFilesDir().getAbsolutePath()+ "/", true);
}
// python -> /data/data/com.android.python27/files/python
else if (sFileName.endsWith(GlobalConstants.PYTHON_ZIP_NAME)) {
succeed &= Utils.unzip(content, this.getFilesDir().getAbsolutePath()+ "/", true);
FileUtils.chmod(new File(this.getFilesDir().getAbsolutePath()+ "/python/bin/python" ), 0755);
}
// python extras -> /sdcard/com.android.python27/extras/python
else if (sFileName.endsWith(GlobalConstants.PYTHON_EXTRAS_ZIP_NAME)) {
Utils.createDirectoryOnExternalStorage( this.getPackageName() + "/" + "extras");
Utils.createDirectoryOnExternalStorage( this.getPackageName() + "/" + "extras" + "/" + "tmp");
succeed &= Utils.unzip(content, Environment.getExternalStorageDirectory().getAbsolutePath() + "/" + this.getPackageName() + "/extras/", true);
}
} catch (Exception e) {
Log.e(GlobalConstants.LOG_TAG, "Failed to copyResourcesToLocal", e);
succeed = false;
}
} // end for all files in res/raw
}
@Override
protected void onStart() {
super.onStart();
String s = "System infos:";
s += " OS Version: " + System.getProperty("os.version") + "(" + android.os.Build.VERSION.INCREMENTAL + ")";
s += " | OS API Level: " + android.os.Build.VERSION.SDK;
s += " | Device: " + android.os.Build.DEVICE;
s += " | Model (and Product): " + android.os.Build.MODEL + " ("+ android.os.Build.PRODUCT + ")";
Log.i(GlobalConstants.LOG_TAG, s);
//finish();
}
}
这是清单文件:
<?xml version="1.0" encoding="utf-8"?>
<manifest package="com.android.python27"
android:versionCode="1"
android:versionName="1.0"
android:installLocation="internalOnly"
xmlns:android="http://schemas.android.com/apk/res/android">
<uses-sdk android:minSdkVersion="4"/>
<uses-permission
android:name="android.permission.ACCESS_WIFI_STATE"
android:required="true" />
<uses-permission
android:name="android.permission.CHANGE_WIFI_STATE"
android:required="true" />
<uses-permission
android:name="android.permission.INTERNET"
android:required="true" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<application android:debuggable="true"
android:icon="@drawable/icon"
android:label="@string/app_name"
android:name="com.android.python27.ScriptApplication">
<activity android:name=".ScriptActivity"
android:configChanges="keyboardHidden|orientation"
android:theme="@android:style/Theme.Translucent.NoTitleBar">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
<intent-filter>
<action android:name="com.googlecode.android_scripting.action.ACTION_LAUNCH_FOR_RESULT" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</activity>
<service android:name="ScriptService">
<intent-filter>
<action android:name="com.android.python27.ScriptService" />
</intent-filter>
</service>
<service android:name="BackgroundScriptService">
<intent-filter>
<action android:name="com.android.python27.BackgroundScriptService" />
</intent-filter>
</service>
<service android:name=".RpcServerService" />
<activity android:configChanges="keyboardHidden|orientation"
android:name="com.googlecode.android_scripting.activity.FutureActivity"
android:theme="@android:style/Theme.Translucent"/>
<activity android:theme="@android:style/Theme.Translucent.NoTitleBar"
android:configChanges="keyboardHidden|orientation"
android:name="com.android.python27.DialogActivity"/>
<activity
android:name=".RpcServerLauncher"
android:taskAffinity=""
android:theme="@android:style/Theme.Translucent.NoTitleBar">
<intent-filter>
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</activity>
</application>
<supports-screens android:xlargeScreens="true" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<!-- <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/> -->
<!-- <uses-permission android:name="android.permission.REBOOT"/> -->
<!-- <uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/> -->
<!-- <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/> -->
<!-- <uses-permission android:name="android.permission.READ_LOGS"/> -->
<!-- <uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/> -->
<!-- <uses-permission android:name="android.permission.EXPAND_STATUS_BAR"/> -->
<!-- <uses-permission android:name="android.permission.STATUS_BAR"/> -->
<!-- <uses-permission android:name="android.permission.DELETE_PACKAGES"/> -->
<!-- <uses-permission android:name="android.permission.INSTALL_PACKAGES"/> -->
<!-- <uses-permission android:name="android.permission.VIBRATE" /> -->
<!-- <uses-permission
android:name="android.permission.ACCESS_CHECKIN_PROPERTIES"/> -->
<!-- <uses-permission
android:name="android.permission.ACCESS_COARSE_LOCATION"/> -->
<!-- <uses-permission
android:name="android.permission.ACCESS_FINE_LOCATION"/> -->
<!-- <uses-permission
android:name="android.permission.ACCESS_LOCATION_EXTRA_COMMANDS"/> -->
<!-- <uses-permission
android:name="android.permission.ACCESS_MOCK_LOCATION"/> -->
<!-- <uses-permission
android:name="android.permission.ACCESS_SURFACE_FLINGER"/> -->
<!-- <uses-permission
android:name="android.permission.ACCOUNT_MANAGER"/> -->
<!-- <uses-permission
android:name="android.permission.AUTHENTICATE_ACCOUNTS"/> -->
<!-- <uses-permission
android:name="android.permission.BACKUP"/> -->
<!-- <uses-permission
android:name="android.permission.BACKUP_DATA"/> -->
<!-- <uses-permission
android:name="android.permission.BATTERY_STATS"/> -->
<!-- <uses-permission
android:name="android.permission.BIND_APPWIDGET"/> -->
<!-- <uses-permission
android:name="android.permission.BIND_INPUT_METHOD"/> -->
<!-- <uses-permission
android:name="android.permission.BIND_WALLPAPER"/> -->
<!-- <uses-permission
android:name="android.permission.BLUETOOTH"/> -->
<!-- <uses-permission
android:name="android.permission.BLUETOOTH_ADMIN"/> -->
<!-- <uses-permission
android:name="android.permission.BRICK"/> -->
<!-- <uses-permission
android:name="android.permission.BROADCAST_PACKAGE_REMOVED"/> -->
<!-- <uses-permission
android:name="android.permission.BROADCAST_SMS"/> -->
<!-- <uses-permission
android:name="android.permission.BROADCAST_STICKY"/> -->
<!-- <uses-permission
android:name="android.permission.BROADCAST_WAP_PUSH"/> -->
<!-- <uses-permission
android:name="android.permission.CALL_PHONE"/> -->
<!-- <uses-permission
android:name="android.permission.CALL_PRIVILEGED"/> -->
<!-- <uses-permission
android:name="android.permission.CAMERA"/> -->
<!-- <uses-permission
android:name="android.permission.CHANGE_BACKGROUND_DATA_SETTING"/> -->
<!-- <uses-permission
android:name="android.permission.CHANGE_COMPONENT_ENABLED_STATE"/> -->
<!-- <uses-permission
android:name="android.permission.CHANGE_CONFIGURATION"/> -->
<!-- <uses-permission
android:name="android.permission.CHANGE_NETWORK_STATE"/> -->
<!-- <uses-permission
android:name="android.permission.CHANGE_WIFI_MULTICAST_STATE"/> -->
<!-- <uses-permission
android:name="android.permission.CHANGE_WIFI_STATE"/> -->
<!-- <uses-permission
android:name="android.permission.CLEAR_APP_CACHE"/> -->
<!-- <uses-permission
android:name="android.permission.CLEAR_APP_USER_DATA"/> -->
<!-- <uses-permission
android:name="android.permission.CONTROL_LOCATION_UPDATES"/> -->
<!-- <uses-permission
android:name="android.permission.DELETE_CACHE_FILES"/> -->
<!-- <uses-permission
android:name="android.permission.DEVICE_POWER"/> -->
<!-- <uses-permission
android:name="android.permission.DIAGNOSTIC"/> -->
<!-- <uses-permission
android:name="android.permission.DISABLE_KEYGUARD"/> -->
<!-- <uses-permission
android:name="android.permission.DUMP"/> -->
<!-- <uses-permission
android:name="android.permission.FACTORY_TEST"/> -->
<!-- <uses-permission
android:name="android.permission.FLASHLIGHT"/> -->
<!-- <uses-permission
android:name="android.permission.FORCE_BACK"/> -->
<!-- <uses-permission
android:name="android.permission.GET_ACCOUNTS"/> -->
<!-- <uses-permission
android:name="android.permission.GET_PACKAGE_SIZE"/> -->
<!-- <uses-permission
android:name="android.permission.GET_TASKS"/> -->
<!-- <uses-permission
android:name="android.permission.GLOBAL_SEARCH"/> -->
<!-- <uses-permission
android:name="android.permission.GLOBAL_SEARCH_CONTROL"/> -->
<!-- <uses-permission
android:name="android.permission.HARDWARE_TEST"/> -->
<!-- <uses-permission
android:name="android.permission.INJECT_EVENTS"/> -->
<!-- <uses-permission
android:name="android.permission.INSTALL_LOCATION_PROVIDER"/> -->
<!-- <uses-permission
android:name="android.permission.INTERNAL_SYSTEM_WINDOW"/> -->
<!-- <uses-permission
android:name="android.permission.MANAGE_ACCOUNTS"/> -->
<!-- <uses-permission
android:name="android.permission.MANAGE_APP_TOKENS"/> -->
<!-- <uses-permission
android:name="android.permission.MASTER_CLEAR"/> -->
<!-- <uses-permission
android:name="android.permission.MODIFY_AUDIO_SETTINGS"/> -->
<!-- <uses-permission
android:name="android.permission.MODIFY_PHONE_STATE"/> -->
<!-- <uses-permission
android:name="android.permission.MOUNT_FORMAT_FILESYSTEMS"/> -->
<!-- <uses-permission
android:name="android.permission.PACKAGE_USAGE_STATS"/> -->
<!-- <uses-permission
android:name="android.permission.PERFORM_CDMA_PROVISIONING"/> -->
<!-- <uses-permission
android:name="android.permission.PERSISTENT_ACTIVITY"/> -->
<!-- <uses-permission
android:name="android.permission.PROCESS_OUTGOING_CALLS"/> -->
<!-- <uses-permission
android:name="android.permission.READ_CALENDAR"/> -->
<!-- <uses-permission
android:name="android.permission.READ_CONTACTS"/> -->
<!-- <uses-permission
android:name="android.permission.READ_FRAME_BUFFER"/> -->
<!-- <uses-permission
android:name="android.permission.READ_HISTORY_BOOKMARKS"/> -->
<!-- <uses-permission
android:name="android.permission.READ_INPUT_STATE"/> -->
<!-- <uses-permission
android:name="android.permission.READ_OWNER_DATA"/> -->
<!-- <uses-permission
android:name="android.permission.READ_PHONE_STATE"/> -->
<!-- <uses-permission
android:name="android.permission.READ_SMS"/> -->
<!-- <uses-permission
android:name="android.permission.READ_SYNC_SETTINGS"/> -->
<!-- <uses-permission
android:name="android.permission.READ_SYNC_STATS"/> -->
<!-- <uses-permission
android:name="android.permission.READ_USER_DICTIONARY"/> -->
<!-- <uses-permission
android:name="android.permission.REBOOT"/> -->
<!-- <uses-permission
android:name="android.permission.RECEIVE_MMS"/> -->
<!-- <uses-permission
android:name="android.permission.RECEIVE_SMS"/> -->
<!-- <uses-permission
android:name="android.permission.RECEIVE_WAP_PUSH"/> -->
<!-- <uses-permission
android:name="android.permission.RECORD_AUDIO"/> -->
<!-- <uses-permission
android:name="android.permission.REORDER_TASKS"/> -->
<!-- <uses-permission
android:name="android.permission.RESTART_PACKAGES"/> -->
<!-- <uses-permission
android:name="android.permission.SEND_SMS"/> -->
<!-- <uses-permission
android:name="android.permission.SET_ACTIVITY_WATCHER"/> -->
<!-- <uses-permission
android:name="android.permission.SET_ALWAYS_FINISH"/> -->
<!-- <uses-permission
android:name="android.permission.SET_ANIMATION_SCALE"/> -->
<!-- <uses-permission
android:name="android.permission.SET_DEBUG_APP"/> -->
<!-- <uses-permission
android:name="android.permission.SET_ORIENTATION"/> -->
<!-- <uses-permission
android:name="android.permission.SET_PREFERRED_APPLICATIONS"/> -->
<!-- <uses-permission
android:name="android.permission.SET_PROCESS_LIMIT"/> -->
<!-- <uses-permission
android:name="android.permission.SET_TIME_ZONE"/> -->
<!-- <uses-permission
android:name="android.permission.SET_WALLPAPER"/> -->
<!-- <uses-permission
android:name="android.permission.SET_WALLPAPER_COMPONENT"/> -->
<!-- <uses-permission
android:name="android.permission.SET_WALLPAPER_HINTS"/> -->
<!-- <uses-permission
android:name="android.permission.SHUTDOWN"/> -->
<!-- <uses-permission
android:name="android.permission.SIGNAL_PERSISTENT_PROCESSES"/> -->
<!-- <uses-permission
android:name="android.permission.STOP_APP_SWITCHES"/> -->
<!-- <uses-permission
android:name="android.permission.SUBSCRIBED_FEEDS_READ"/> -->
<!-- <uses-permission
android:name="android.permission.SUBSCRIBED_FEEDS_WRITE"/> -->
<!-- <uses-permission
android:name="android.permission.SYSTEM_ALERT_WINDOW"/> -->
<!-- <uses-permission
android:name="android.permission.UPDATE_DEVICE_STATS"/> -->
<!-- <uses-permission
android:name="android.permission.USE_CREDENTIALS"/> -->
<!-- <uses-permission
android:name="android.permission.WAKE_LOCK"/> -->
<!-- <uses-permission
android:name="android.permission.WRITE_APN_SETTINGS"/> -->
<!-- <uses-permission
android:name="android.permission.WRITE_CALENDAR"/> -->
<!-- <uses-permission
android:name="android.permission.WRITE_CONTACTS"/> -->
<!-- <uses-permission
android:name="android.permission.WRITE_EXTERNAL_STORAGE"/> -->
<!-- <uses-permission
android:name="android.permission.WRITE_GSERVICES"/> -->
<!-- <uses-permission
android:name="android.permission.WRITE_HISTORY_BOOKMARKS"/> -->
<!-- <uses-permission
android:name="android.permission.WRITE_OWNER_DATA"/> -->
<!-- <uses-permission
android:name="android.permission.WRITE_SECURE_SETTINGS"/> -->
<!-- <uses-permission
android:name="android.permission.WRITE_SETTINGS"/> -->
<!-- <uses-permission
android:name="android.permission.WRITE_SMS"/> -->
<!-- <uses-permission
android:name="android.permission.WRITE_SYNC_SETTINGS"/> -->
<!-- <uses-permission
android:name="android.permission.WRITE_USER_DICTIONARY"/> -->
<!-- <uses-permission android:name="android.permission.VIBRATE"></uses-permission> -->
</manifest>
当你第一次执行启动时,android-python27应用程序会出现一个活动,它会在我的设备中安装所需的文件夹。每当你尝试它再次打开它它什么都不做(它不会打开一个活动,只执行打印&#34;你好&#34;)的python脚本。 我想要的是更改清单文件,以便在我再次打开应用程序后打开我自己的活动。(在本地安装所需文件夹的活动应该只在第一次执行。)
任何建议都会有所帮助并深受赞赏。
答案 0 :(得分:1)
manifests.xml
中的主要活动无法更改,这意味着创建的第一个活动一旦确定就无法更改,但第一个活动的视图无法显示任何内容并执行您的自定义逻辑并转到另一个活性。
为了满足您的需求,您可以在检测到文件安装后启动活动。
if(installNeeded) {
setContentView(R.layout.install);
new InstallAsyncTask().execute();
}
else {
runScriptService();
finish();
startActivity(this,<nextactivity you want to goto>) //add this
}