android調用其他程序
A. 如何通過android的應用程序調用另一個應用
如果你知道另外一個程序的類名就可以這樣寫
java">intent.addCategory(Intent.CATEGORY_LAUNCHER);
ComponentNamecn=newComponentName(packageName,className);
intent.setComponent(cn);
startActivity(intent);
2.如果你只知道包名不知道類名,首先獲取類名
privatevoidopenApp(StringpackageName){
PackageInfopi=getPackageManager().getPackageInfo(packageName,0);
IntentresolveIntent=newIntent(Intent.ACTION_MAIN,null);
resolveIntent.addCategory(Intent.CATEGORY_LAUNCHER);
resolveIntent.setPackage(pi.packageName);
List<ResolveInfo>apps=pm.queryIntentActivities(resolveIntent,0);
ResolveInfori=apps.iterator().next();
if(ri!=null){
StringpackageName=ri.activityInfo.packageName;
StringclassName=ri.activityInfo.name;
Intentintent=newIntent(Intent.ACTION_MAIN);
intent.addCategory(Intent.CATEGORY_LAUNCHER);
ComponentNamecn=newComponentName(packageName,className);
intent.setComponent(cn);
startActivity(intent);
}
}
然後使用1中的方法調用程序
B. android應用程序怎麼調用外部java文件和XML文件
沒明白你的意思,android生成新的layout的時候在它的R這個類里會自動在layout方法里添加這個XML文件的關連,同時XML里的控制項也會添加到ID這個方法里,你只需要在新的activity子類里調用this.setContentView(R.layout.xml名)就能將這個子類與新的XML關聯上,同時在你的主界面上調用
控制項類型
引用名 =
(控制項)
findViewById(R.id.XML中的控制項名);就可以得到這個控制項了
C. 如何在一個android應用裡面調用一個系統的應用程序呢
//調用系統照相機
public void cameraInfo(){
Intent intent = new Intent("android.media.action.IMAGE_CAPTURE");
//照片保存的路徑及保存的名稱
intent.putExtra(MediaStore.EXTRA_OUTPUT,
Uri.fromFile(new File("/sdcard/JetMobileDev/camera.jpg"));
startActivityForResult(intent, 1);
}
D. android 在一個應用程序裡面調用另一個應用程序 打開頁面怎麼與原先應用程序的頁面一致
這個是行不通的,有些程序的Activity 是不能通過其他程序打開的,會直接出現java.lang.SecurityException: Permission Denial:
E. android中一個應用程序如何調用到另一個另一程序的activity
生成一個要被調用的APK。在其Manifest.xml設置中,與一般的寫法大致相同,唯一區別的地方在於-->安裝這個要被調用的APK。安裝完畢之後,你會發現,系統中找不到這個程序。別急,它確實安裝在手機裡面了,但是因為他不是main的,所以系統不會把他當做Application的入口程序。而要想打開這個activity,只有知道它名字的人才可以。跟系統的intent一樣使用。它的名字定義為"testApp",所以,這里用這個字元串就可以調用它了在另一個項目中調用上述APK。代碼如下java">Intentintent=newIntent("testApp");startActivity(intent);啟動另外一個apkjava">IntentmIntent=newIntent();ComponentNamecomp=newComponentName(packageName,activityName);mIntent.setComponent(comp);mIntent.setAction("android.intent.action.VIEW");startActivity(mIntent);
F. android 裡面如何在一個Activity裡面調用另外一個Activity裡面的方法
靜態調用,如果有組件的初始化這些操作,是絕對會報這個錯誤的,因為Activity方法不會去調用它的OnCreate方法,無法載入xml布局
。
假使你要去初始化整個Activity,其
構造方法
也是無法初始化的,所以也是空指針
。
G. 如何在一個android工程中調用另一個android工程的代碼和資源啊
現在已經有了一個Android工程A。我們想擴展A的功能,但是不想在A的基礎上做開發,於是新建了另外一個Android工程B,想在B中引用A。
1. 把工程A做成純Jar包,這樣其他的工程就可以直接引用了。
但是,如果在工程A中用了R.java中的引用,則無法打成jar包了。原因是R.java是自動生成的,是動態的,每次編譯都是不相同的。如果一定要做成jar包,就不能使用自動生成的R文件,用到資源時候就要寫代碼去獲取。
有時會報錯:Conversion to Dalvik format failed with error 1
可能是多層包文件重復導入,沖突。。。
這時可以試試方法2
2.將工程A做成android library project。
設置工程A,右鍵->Properties->Android,將Is library項選中,然後Apply。設置工程B,右鍵->Properties->Android,在Library中,點擊Add按鈕,將A工程加入,然後Apply。此時在B中就引入了A中的資源和代碼,這些資源和代碼都可以直接調用。需要注意的是,因為A已經不再是一個完整的Android應用,而是一個類庫工程,所以有一些內容還需要在B中配置一下。比如A中有lib庫引用,則B中也要加入該lib庫;比如A中的AndroidManifest.xml文件的內容,在B的AndroidManifest.xml文件中也要相應加上。。。
如果不需要引用A工程的資源文件,同樣只需得到jar文件,
設置工程A,右鍵->Properties->Android,將Is library項選中,然後Apply。在A工程的bin目錄下能得到一個jar文件,可以到B工程中的libs目錄下直接引用。
如果能用jar當然最好,但是jar文件不能把res目錄下的資源打包進去,所以才出現lib工程。
創建和使用Android library工程
摘要: 創建library供多個工程共享代碼、資源是非常常見的需求,網上這種資料非常少,基本上都是講創建java工程,然後export,這種方式缺點非常多,大家可以自己google一下。本文著重介紹如何創建Android library,並且在 ...
創建library供多個工程共享代碼、資源是非常常見的需求,網上這種資料非常少,基本上都是講創建java工程,然後export,這種方式缺點非常多,大家可以自己google一下。
本文著重介紹如何創建Android library,並且在工程中使用此library提供的資源,具體步驟如下:
1. 創建一個Android工程,命名為MyLib
2. 進入工程設置選中Is Library
3. 創建另一個Android工程,命名為MyProj
4. 進入工程設置,添加MyLib
5. 在MyProj的AndroidManifest.xml中加入對library中activity的引用
<activity android:name="net.devdiv.mylib.MyLib" />
6. 由於編譯後library中的資源和引用它的project資源是合並在一起的,為了避免重名問題,需要對library中資源進行重命名
1). 把main.xml改為mylib.xml,同時修改MyLib.java代碼setContentView(R.layout.mylib);
2). strings.xml修改為
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="mylibhello">String fetched from lib!</string>
<string name="mylib_app_name">MyLib</string>
</resources>
7. 在MyProj中引用MyLib的資源
package net.devdiv.myproj;
import android.app.Activity;
import android.os.Bundle;
import android.widget.TextView;
import net.devdiv.mylib.*;
import android.content.Intent;
public class MyProj extends Activity {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
TextView tv = (TextView)findViewById(R.id.myprojtext);
tv.setText(R.string.mylibhello);
Intent it = new Intent(this, MyLib.class);
startActivity(it);
}
}
H. Android如何實現不同應用之間的調用
使用ComponentName()可以跳轉到任何一個activity,不論是不是main activity。也不必寫修改被調用的apk的AndroidManifest.xml任何內容,如下:
packagecom.hooy.apk1;
importandroid.app.Activity;
importandroid.content.ComponentName;
importandroid.content.Intent;
importandroid.os.Bundle;
importandroid.view.MotionEvent;
{
@Override
publicvoidonCreate(BundlesavedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
}
@Override
publicbooleanonTouchEvent(MotionEventevent){
ComponentNamecomponetName=newComponentName(
//這個是另外一個應用程序的包名
"com.hooy.apk2",
//這個參數是要啟動的Activity
"com.hooy.apk2.Pay_Activity");
//Intentintent=newIntent("chroya.foo");
Intentintent=newIntent();
//我們給他添加一個參數表示從apk1傳過去的
Bundlebundle=newBundle();
bundle.putString("arge1","這是跳轉過來的!來自apk1");
intent.putExtras(bundle);
intent.setComponent(componetName);
startActivity(intent);
returnsuper.onTouchEvent(event);
}
}
ComponentName的參數已經寫的比較詳細了
packagecom.hooy.apk2;
importandroid.app.Activity;
importandroid.content.Intent;
importandroid.os.Bundle;
importandroid.widget.TextView;
publicclassPay_ActivityextendsActivity{
@Override
protectedvoidonCreate(BundlesavedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
//改變文字內容,標志這是從activity跳轉過來的
TextViewtexView=(TextView)findViewById(R.id.text1);
texView.setText("我來自其他activity");
Intentintent=getIntent();
Stringvalue=intent.getStringExtra("arge1");
if(value!=null&&!value.equals("")){
texView.setText(value);//這里將顯示「這是跳轉過來的!來自apk1」
}else{
System.out.println("空的參數");
}
}
}
I. 怎麼打開第三方應用程序
需求場景:
在自己開發的應用程序里,有個跳轉到其他應用的按鈕,比如分享到「新浪微博」,當點擊這個按鈕時,先判斷手機中是否有安裝「新浪微博」這個程序,有則啟動「新浪微博」客戶端,否則從指定的URL地址進行下載。
簡言之,開啟其他應用,包名跳轉。
1、從一個應用跳轉到其他應用要獲取什麼信息?
need第三方應用的包名,以及下載鏈接。
2、如何判斷本機是否已經安裝了該第三方應用?
(1)首先得到該程序的包名;
別人的應用程序我怎麼知道他的包名和類名?
- 通過adb裡面看程序裝的所有應用
- 寫一個遍歷程序,獲取所有已安裝的程序,把包名列印出來,新浪微博的包名中應該會帶有sina字眼,如 com.sina.weibo
//獲取已經安裝apk列表
List<PackageInfo> packList = context.getPackageManager().getInstalledPackages(0);
//獲得包名PackageInfo.packageName
(2)然後通過PackageManager判斷是否存在該包的程序 。
android的每一個apk的activity的包的名字都是唯一的,所以可以通過判斷這個activity所在包的名字來判斷是不是該Apk已經安裝
例1:
//以twitter程序為例,假設twitter程序包名為「com.twitter.android」。這時候可用以下代碼來判斷是否被安裝。
//QQ客戶端的包名是"com.tencent.mobileqq"
PackageInfo packageInfo;//PackageInfo所在包為android.content.pm
try {
packageInfo = this.getPackageManager().getPackageInfo("com.twitter.android", 0);
} catch (NameNotFoundException e) {
packageInfo = null;
e.printStackTrace();
}
if(packageInfo ==null){
System.out.println("沒有安裝");
}else{
System.out.println("已經安裝");
}
例2:可以封裝到方法里,操作一樣,只是把包名作為參數傳入,返回值為布爾類型
private boolean isPkgInstalled(String pkgName) {
PackageInfo packageInfo = null;
try {
packageInfo = this.getPackageManager().getPackageInfo(pkgName, 0);
} catch (NameNotFoundException e) {
packageInfo = null;
e.printStackTrace();
}
if (packageInfo == null) {
return false;
} else {
return true;
}
3、怎麼跳轉?
通過隱式intent跳轉
例3:PackageManager中有getLaunchIntentForPackage這個方法!
//String pkg代表包名,String download代表下載url
final PackageManager pm = context.getPackageManager();
Intent intent = pm.getLaunchIntentForPackage(pkg);
if (null == intent) {//沒有獲取到intent
if (!TextUtils.isEmpty(downoad)) {//跳轉到下載第三方應用界面
context.startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse(downoad)));
}
} else {
context.startActivity(intent);
}
例4:在我們自己的程序中調用其他程序時往往要檢查手機有沒有安裝該軟體後再做相應操作,如沒有安裝,用intent將用戶引導至android market去下載該程序,如已安裝則打開該程序,並傳入參數和調用其功能。
//下面介紹怎麼判斷手機已安裝某程序的方法:
private boolean isAvilible(Context context, String packageName){
final PackageManager packageManager = context.getPackageManager();//獲取packagemanager
List< packageInfo> pinfo = packageManager.getInstalledPackages(0);//獲取所有已安裝程序的包信息
List<String> pName = new ArrayList<String>();//用於存儲所有已安裝程序的包名
//從pinfo中將包名字逐一取出,壓入pName list中
if(pinfo != null){
for(int i = 0; i < pinfo.size(); i++){
String pn = pinfo.get(i).packageName;
pName.add(pn);
}
}
return pName.contains(packageName);//判斷pName中是否有目標程序的包名,有TRUE,沒有FALSE
}
//下面是調用該方法進行判斷後的邏輯:
//已安裝,打開程序,需傳入參數包名:"com.skype.android.verizon"
if(isAvilible(this, "com.skype.android.verizon")){
Intent i = new Intent();
ComponentName cn = new ComponentName("com.skype.android.verizon",
"com.skype.android.verizon.SkypeActivity");
i.setComponent(cn);
startActivityForResult(i, RESULT_OK);
}
//未安裝,跳轉至market下載該程序
else {
Uri uri = Uri.parse("market://details?id=com.skype.android.verizon");//id為包名
Intent it = new Intent(Intent.ACTION_VIEW, uri);
startActivity(it);
}
參考鏈接:http://www.eoeandroid.com/thread-152763-1-1.html?_dsign=2242c74c
4、跳轉後呢?
如何在android應用程序中啟動其他apk程序,被啟動程序退出後返回之前的程序?
//你只需要在A中打開B,並為B設置 intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
//不做對A的關閉處理finish() 這樣就可以了
Intent intent=new Intent();
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
intent.setComponent(new ComponentName(objAppClassName, mainActivity));
context.startActivity(intent);
例5:原始跳轉方法,要包名和類名(通過ComponentName),後來可以只要包名…
Android 開發有時需要在一個應用中啟動另一個應用,比如Launcher載入所有的已安裝的程序的列表,當點擊圖標時可以啟動另一個應用。
一般我們知道了另一個應用的包名和MainActivity的名字之後便可以直接通過如下代碼來啟動:
Intent intent = new Intent(Intent.ACTION_MAIN);
intent.addCategory(Intent.CATEGORY_LAUNCHER);
ComponentName cn = new ComponentName(packageName, className);
intent.setComponent(cn);
startActivity(intent);
但是更多的時候,我們一般都不知道應用程序的啟動Activity的類名,而只知道包名,我們可以通過ResolveInfo類來取得啟動Acitivty的類名。
下面是實現代碼:
private void openApp(String packageName) {
PackageInfo pi = getPackageManager().getPackageInfo(packageName, 0);
Intent resolveIntent = new Intent(Intent.ACTION_MAIN, null);
resolveIntent.addCategory(Intent.CATEGORY_LAUNCHER);
resolveIntent.setPackage(pi.packageName);
List<ResolveInfo> apps = pm.queryIntentActivities(resolveIntent, 0);
ResolveInfo ri = apps.iterator().next();
if (ri != null ) {
String packageName = ri.activityInfo.packageName;
String className = ri.activityInfo.name;
Intent intent = new Intent(Intent.ACTION_MAIN);
intent.addCategory(Intent.CATEGORY_LAUNCHER);
ComponentName cn = new ComponentName(packageName, className);
intent.setComponent(cn);
startActivity(intent);
}
}
J. Android 調用其他應用打開文件
/**
*打開文件
*@paramfile
*/
privatevoidopenFile(Filefile){
Intentintent=newIntent();
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
//設置intent的Action屬性
intent.setAction(Intent.ACTION_VIEW);
//獲取文件file的MIME類型
Stringtype=getMIMEType(file);
//設置intent的data和Type屬性。
intent.setDataAndType(/*uri*/Uri.fromFile(file),type);
//跳轉
startActivity(intent);
}
/**
*根據文件後綴名獲得對應的MIME類型。
*@paramfile
*/
privateStringgetMIMEType(Filefile){
Stringtype="*/*";
StringfName=file.getName();
//獲取後綴名前的分隔符"."在fName中的位置。
intdotIndex=fName.lastIndexOf(".");
if(dotIndex<0){
returntype;
}
/*獲取文件的後綴名*/
Stringend=fName.substring(dotIndex,fName.length()).toLowerCase();
if(end=="")returntype;
//在MIME和文件類型的匹配表中找到對應的MIME類型。
for(inti=0;i<MIME_MapTable.length;i++){//MIME_MapTable??在這里你一定有疑問,這個MIME_MapTable是什麼?
if(end.equals(MIME_MapTable[i][0]))
type=MIME_MapTable[i][1];
}
returntype;
}具體的看這篇文章http://tonysun3544.iteye.com/blog/1265884