當前位置:首頁 » 操作系統 » toast源碼

toast源碼

發布時間: 2023-09-19 01:11:20

⑴ 求助一個Android 文件選擇器的源碼(用於上傳文件時選擇並...

打開文件選擇器:
private void showFileChooser() {
Intent intent = new Intent(Intent.ACTION_GET_CONTENT);
intent.setType("*/*");
intent.addCategory(Intent.CATEGORY_OPENABLE);

try {
startActivityForResult( Intent.createChooser(intent, "Select a File to Upload"), FILE_SELECT_CODE);
} catch (android.content.ActivityNotFoundException ex) {
Toast.makeText(this, "Please install a File Manager.", Toast.LENGTH_SHORT).show();
}
}
選擇結果:

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
switch (requestCode) {
case FILE_SELECT_CODE:
if (resultCode == RESULT_OK) {
// Get the Uri of the selected file
Uri uri = data.getData();
String path = FileUtils.getPath(this, uri);
}
break;
}
super.onActivityResult(requestCode, resultCode, data);
}
FileUtils文件

public class FileUtils {
public static String getPath(Context context, Uri uri) {

if ("content".equalsIgnoreCase(uri.getScheme())) {
String[] projection = { "_data" };
Cursor cursor = null;

try {
cursor = context.getContentResolver().query(uri, projection,null, null, null);
int column_index = cursor.getColumnIndexOrThrow("_data");
if (cursor.moveToFirst()) {
return cursor.getString(column_index);
}
} catch (Exception e) {
// Eat it
}
}

else if ("file".equalsIgnoreCase(uri.getScheme())) {
return uri.getPath();
}

return null;
}
}

⑵ 安卓如何實現獲取網頁源代碼

public class GetHtmlCodeActivity extends Activity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);

TextView textView = (TextView)this.findViewById(R.id.picture_textview);
try {
textView.setText(getPictureData("http://www..com"));
} catch (Exception e) {
Log.e("GetHtmlCodeActivity", e.toString());
Toast.makeText(GetHtmlCodeActivity.this, "網路連接失敗", 1).show();
}
}
//得到圖片的二進制數據
public String getPictureData(String path) throws Exception{
// 類 URL 代表一個統一資源定位符,它是指向互聯網「資源」的指針。
URL url = new URL("http://www..com/");
// 每個 HttpURLConnection 實例都可用於生成單個請求,
//但是其他實例可以透明地共享連接到 HTTP 伺服器的基礎網路
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
//設置 URL 請求的方法
conn.setRequestMethod("GET");
//設置一個指定的超時值(以毫秒為單位),
//該值將在打開到此 URLConnection 引用的資源的通信鏈接時使用。
conn.setConnectTimeout(5 * 1000);
// conn.getInputStream()返回從此打開的連接讀取的輸入流
InputStream inStream = conn.getInputStream();// 通過輸入流獲取html數據
byte[] data = readInputStream(inStream);// 得到html的二進制數據
String html = new String(data);
return html;

}
//讀取輸入流中的數據,返回位元組數組byte[]
public byte[] readInputStream(InputStream inStream) throws Exception{
//此類實現了一個輸出流,其中的數據被寫入一個 byte 數組
ByteArrayOutputStream outStream = new ByteArrayOutputStream();
// 位元組數組
byte[] buffer = new byte[1024];
int len = 0;
//從輸入流中讀取一定數量的位元組,並將其存儲在緩沖區數組buffer 中
while ((len = inStream.read(buffer)) != -1) {
// 將指定 byte 數組中從偏移量 off 開始的 len 個位元組寫入此輸出流
outStream.write(buffer, 0, len);
}
inStream.close();
//toByteArray()創建一個新分配的 byte 數組。
return outStream.toByteArray();
}
}

可以看一下這個自己想想哦

⑶ android下打開Web瀏覽器的幾種常見的方法

android下打開Web瀏覽器的幾種常見的方法如下:

一。通過意圖實現瀏覽

//通過下述方法打開瀏覽器

java">privatevoidopenBrowser(){
//urlText是一個文本輸入框,輸入網站地址
//Uri是統一資源標識符
Uriuri=Uri.parse(urlText.getText().toString());
Intentintent=newIntent(Intent.ACTION_VIEW,uri);
startActivity(intent);
}

注意:輸入URL時,不要忘記「http://」部分。

二。利用視圖打開網頁,是通過調用WebKit瀏覽器引擎提供的WebView實現的。

具體源代碼如下:

<?xmlversion="1.0"encoding="utf-8"?>
<LinearLayoutxmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
>
<TextView
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="@string/hello"
/>
<LinearLayoutandroid:orientation="horizontal"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
>
<EditText
android:layout_width="240dp"
android:layout_height="wrap_content"
android:id="@+id/etWebSite"
android:hint="輸入網址"
android:singleLine="true"
android:layout_marginRight="5dp"
/>
<Button
android:id="@+id/searchBtn"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="搜索"
android:layout_marginRight="5dp"
/>
</LinearLayout>
<LinearLayoutandroid:orientation="horizontal"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
>
<Button
android:id="@+id/backBtn"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="上一頁"
android:layout_marginRight="5dp"
/>
<Button
android:id="@+id/nextBtn"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="下一頁"
android:layout_marginRight="5dp"
/>
</LinearLayout>
<WebViewandroid:id="@+id/webView1"android:layout_width="match_parent"
android:layout_height="match_parent"></WebView>
</LinearLayout>
/res/src/com.myandroid


packagecom.myandroid;
importandroid.app.Activity;
importandroid.os.Bundle;
importandroid.view.View;
importandroid.webkit.URLUtil;
importandroid.webkit.WebView;
importandroid.widget.Button;
importandroid.widget.EditText;
importandroid.widget.Toast;
{

privateButtonschBtn,backBtn,nextBtn;
privateWebViewwebView;
privateEditTextmText;

@Override
publicvoidonCreate(BundlesavedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.main);

schBtn=(Button)findViewById(R.id.searchBtn);
mText=(EditText)findViewById(R.id.etWebSite);
webView=(WebView)findViewById(R.id.webView1);
backBtn=(Button)findViewById(R.id.backBtn);
nextBtn=(Button)findViewById(R.id.nextBtn);
schBtn.setOnClickListener(newView.OnClickListener(){

publicvoidonClick(Viewv){
//TODOAuto-generatedmethodstub
//設置可以使用Javascript
webView.getSettings().setJavaScriptEnabled(true);StringstrURI=mText.getText().toString();
//檢測網站的合法性
if(URLUtil.isNetworkUrl(strURI)){
webView.loadUrl(strURI);
Toast.makeText(WebViewActivity.this,strURI,Toast.LENGTH_SHORT).show();
}else{
Toast.makeText(WebViewActivity.this,"輸入非法網站 "+strURI,Toast.LENGTH_SHORT).show();
}
}
});

backBtn.setOnClickListener(newView.OnClickListener(){

publicvoidonClick(Viewv){
//TODOAuto-generatedmethodstub
if(webView.canGoBack()){
webView.goBack();
}
}
});

nextBtn.setOnClickListener(newView.OnClickListener(){

publicvoidonClick(Viewv){
//TODOAuto-generatedmethodstub
if(webView.canGoForward()){
webView.goForward();
}
}
});
}
}


同時還要在AndroidManifest.xml中添加訪問網際網路的許可權:

<uses-permission android:name="android.permission.INTERNET"/>

⑷ 使用系統Toast的問題

記錄下在使用系統Toast存在的問題:

1. 當通知洞州亂許可權被關閉時華為等手機Toast不顯示;
2. Toast隊列機制上在不同手機上可能不同;
3. Toast的BadTokenException問題;

當發現系統Toast存在問題時,不少同學使用自定義納檔TYPE_TOAST彈框來實現相同效果.雖然情況下效果都是OK的,但TYPE_TOAST依然會存在問題:

4. Android8.0之後的token null is not valid問題(實測部分機型問題);
5. Android7.1之後,不允許同時展示兩個TYPE_TOAST彈窗(實測部分機型問題);

那麼解決方案是:

相信不少同學舊項目中封裝的ToastUtil都是直接使用的ApplicationContext作為上下文,然後在需要彈窗的時候直接就是ToastUtil.show(str),這樣的使用方式對於我們來說是最方便的啦。

當然,使用YToast你也依然可以沿用這種封裝方式,但這種方式在下面這個場景中可能會無法成功展示出彈窗(該場景下原生Toast也一樣無法彈出),不過請放心不會導致應用崩潰,而且這個場景出現的概率較小,有以下三個必要條件:

1.通知欄許可權被關閉(通知欄許可權默認都是打開的)
2.非MIUI手機
3.Android8.0以上的部分手機(我最近測試中的幾部8.0+設備都不存在該問題)。

不過,如果想要保證在所有場景下都能正常展示彈窗,還是建議在YToast.make(context)時傳入Activity作為上下文,這樣在該場景下YToast會啟用ActivityToast展示出彈窗。

接下來再詳細分析下上面提到的五個問題。

看下方Toast源碼中的show()方法,通過AIDL獲跡纖取到INotificationManager,並將接下來的顯示流程式控制制權交給NotificationManagerService。NMS中會對Toast進行許可權校驗,當通知許可權校驗不通過時,Toast將不做展示。

當然不同ROM中NMS可能會有不同,比如MIUI就對這部分內容進行了修改,所以小米手機關閉通知許可權不會導致Toast不顯示。

如何解決這個問題?只要能夠繞過NotificationManagerService即可。

YToast通過使用TYPE_TOAST實現全局彈窗功能,不使用系統Toast,也沒有使用NMS服務,因此不受通知許可權限制。

我找了四台設備,創建兩個Gravity不同的Toast並調用show()方法,結果出現了四種展示效果:

造成這個問題的原因應該是各大廠商ROM中NMS維護Toast隊列的邏輯有差異。
同樣的,YToast內部也維護著自己的隊列邏輯,保證在所有手機上使用DToast的效果相同。

YToast中多個彈窗連續出現時:

相同優先順序時,會終止上一個,直接展示後一個;
不同優先順序時,如果後一個的優先順序更高則會終止上一個,直接展示後一個。

什麼情況下windowToken會失效?

UI線程發生阻塞,導致TN.show()沒有及時執行,當NotificationManager的檢測超時後便會刪除WMS中的該token,即造成token失效。

如何解決?

因此對於8.0之前的我們也需要做相同的處理。YToast是通過反射完成這個動作,具體看下方實現:

Android8.0後對WindowManager做了限制和修改,特別是TYPE_TOAST類型的窗口,必須要傳遞一個token用於校驗。
API25:(PhoneWindowManager.java源碼)

API26:(PhoneWindowManager.java源碼)

為了解決問題一,DovaToast不得不選擇繞過NotificationManagerService的控制,但由於windowToken是NMS生成的,繞過NMS就無法獲取到有效的windowToken,於是作為TYPE_TOAST的DovaToast就可能陷入第四個問題。

因此,DToast選擇在DovaToast出現該問題時引入ActivityToast,在DovaToast無法正常展示時創建一個依附於Activity的彈窗展示出來,不過ActivityToast只會展示在當前Activity,不具有跨頁面功能。

如果說有更好的方案,那肯定是去獲取懸浮窗許可權然後改用TYPE_PHONE等類型,但懸浮窗許可權往往不容易獲取,目前來看恐怕除了微信其他APP都不能保證拿得到用戶的懸浮窗許可權。

YToast的彈窗策略就是同一時間最多隻展示一個彈窗,邏輯上就避免了此問題。因此僅捕獲該異常。

其他建議

如果能夠接受Toast不跨界面的話,建議使用SnackBar

⑸ android studio代碼問題 怎麼讀取簡訊的具體內容。

1.點擊一個按鈕就會顯示系統的聯系人列表,當用戶點擊聯系人之後就會看到詳細的名字和電話。
2.具體的代碼如下:首先在AndroidManifest.xml文件中配置用戶許可權。
<uses-permission android:name="android.permission.READ_CONTACTS"/>11

activity_main.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:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="com.dragon.testevent.MainActivity">

⑹ android的toast怎麼自定義顯示時間長度

Android中Toast的顯示時間為特定時間且不可更改,但是有時候我們開發設計需要讓Toast顯示更長時間,或者自己完全控制Toast的顯示和關閉。通過查看Toast類的源碼,可以看出,這有點難為它了,Toast類本身並沒有提供相應方法。

但是通過源碼的查看,還是可以看出點眉頭。源碼分析思路在這里轉eoe里的一篇文章,思路較為清晰:

轉:

Toast信息提示框之所以在顯示一定時間後會自動關閉,是因為在系統中有一個Toast隊列。系統會依次從隊列中取(出隊列)一個Toast,並 顯示它。在顯示一段時間後,再關閉,然後再顯示下一個Toast信息提示框。

直到Toast隊列中所有Toast都顯示完為止。那麼有些時候需要這個Toas t信息提示框長時間顯示,直到需要關閉它時通過代碼來控制,而不是讓系統自動來關閉Toast信息提示框。

不過這個要求對於Toast本身來說有些過 分,因為Toast類並沒有提供這個功能。雖然如此,但方法總比問題多。通過一些特殊的處理還是可以實現這個功能的,而且並不復雜。

Toast信息提示框需要調用Toast.show方法來顯示。下面來看一下show方法的源代碼。

public void show() {

if (mNextView == null) {

throw new RuntimeException("setView must have been called");

}

INotificationManager service = getService();

String pkg = mContext.getPackageName();

TN tn = mTN;

try {

// 將當前Toast加入到Toast隊列

service.enqueueToast(pkg, tn, mDuration);

} catch (RemoteException e) {

// Empty

}

}
復制代碼

show方法的代碼並不復雜,可以很容易找到如下的代碼。

service.enqueueToast(pkg, tn, mDuration);
復制代碼

從上面的代碼可以很容易推斷出它的功能是將當前的Toast加入到系統的Toast隊列中。

看到這里,各位讀者應該想到。雖然show方法的表面功能是顯示Toast信息提示框,但其實際的功能是將Toast加入到隊列中,再由系統根據Toast隊列來顯示Toast信息提示框。那麼我們經過更進一步地思考,可以大膽地做出一個初步的方案。

既然系統的Toast隊列可以顯示Toast信息提示框,那麼我們為什麼不可以自己來顯示它呢?

這樣不是可以自己來控制Toast的信息提示框的顯示和關閉了嗎!當然,這就不能再調用show方法來顯示Toast信息提示框了(因為show方法會將Toast加入隊列,這樣我們就控制不了Toast了)。

既然初步方案已擬定,現在就來實施它。先在Toast類找一下還有沒有其他的show方法。

結果發現了一個TN類,該類是Toast的一個內嵌類。在TN類中有一個show方法。TN是ITransientNotification.Stub的子類。從ITransientNotification和TN類中的show方法初步推斷(因為Transient的中文意思是「短暫的」)系統是從Toast隊列中獲得了Toast對象後,利用TN對象的show方法顯示Toast,再利用TN.hide方法來關閉Toast。

首先聲明,這只是假設,我們還不知道這么做是否可行!當然,這也是科學研究的一般方法,先推斷或假設,然後再證明推斷或假設。

現在關鍵的一步是獲得TN對象。遺憾的是TN被聲明成private類型,外部無法訪問。不過別著急。在Toast類中有一個mTN變數。雖然不是public變數,但仍然可以通過反射技術訪問該變數。mTN變數會在創建Toast對象時初始化。

因此,只要獲得mTN變數,就獲得了TN對象。下面的代碼顯示了一個永遠不會自動關閉的Toast信息提示框。

// 先創建一個Toast對象Toast toast = Toast.makeText(this, "永不消失的Toast", Toast.LENGTH_SHORT);// 設置Toast信息提示框顯示的位置(在屏幕頂部水平居中顯示)toast.setGravity(Gravity.TOP | Gravity.CENTER_HORIZONTAL, 0, 0);try{

// 從Toast對象中獲得mTN變數Field field = toast.getClass().getDeclaredField("mTN");

field.setAccessible(true);

Object obj = field.get(toast);

// TN對象中獲得了show方法

Method method = obj.getClass().getDeclaredMethod("show", null);

// 調用show方法來顯示Toast信息提示框

method.invoke(obj, null);

}

catch (Exception e)

{

}
復制代碼

上面的代碼中try{…}catch(…){…}語句中的代碼是關鍵。先利用事先創建好的Toast對象獲得了mTN變數。然後再利用反射技術獲得了TN對象的show方法。

關閉Toast和顯示Toast的方法類似,只是需要獲得hide方法,代碼如下:

try

{

// 需要將前面代碼中的obj變數變成類變數。這樣在多個地方就都可以訪問了

Method method = obj.getClass().getDeclaredMethod("hide", null);

method.invoke(obj, null);

}

catch (Exception e)

{

}
復制代碼

上面的代碼已經很完美地實現了通過代碼控制Toast信息提示框顯示和關閉的功能。

但如果想實現得更完美,可以在Android SDK源代碼中找一個叫ITransientNotification.aidl的文件(該文件是AIDL服務定義文件,將在後面詳細介紹),並在Android工程的src目錄中建一個android.app包,將這個文件放到這個包中。

然後ADT會自動在gen目錄中生成了一個android.app包,包中有一個ITransientNotification.java文件。由於Android SDK自帶的ItransientNotification介面屬於內部資源,外部程序無法訪問,因此,只能將從Toast對象中獲得的mTN變數轉換成剛才生成的ITransientNotification對象了。

這樣就不需要使反射技術獲得show和hide方法了。

經過改良的顯示和關閉Toast信息提示框的代碼如下:

ITransientNotification notification = (ITransientNotification) field.get(toast);

// 顯示Toast信息提示框

notification.show();

// 關閉Toast信息提示框

notification.hide();
復制代碼

最後整理代碼如下:

Java代碼

import java.lang.reflect.Field;

import java.lang.reflect.Method;

import android.app.Activity;

import android.os.Bundle;

import android.view.Gravity;

import android.view.View;

import android.widget.Button;

import android.widget.Toast;

public class TestToastActivity extends Activity {

private Button showtoast,closetoast;

private Toast toast;

private Field field;

private Object obj;

private Method showMethod,hideMethod;

@Override

public void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.main);

//初始化按鈕組件

showtoast = (Button)this.findViewById(R.id.showtoast);

closetoast = (Button)this.findViewById(R.id.closetoast);

//設置組件監聽

showtoast.setOnClickListener(new MyOnClickListener());

closetoast.setOnClickListener(new MyOnClickListener());

//創建Toast對象

toast = Toast.makeText(this, "Toast自定義顯示時間測試", 1);

toast.setGravity(Gravity.CENTER_VERTICAL | Gravity.CENTER_HORIZONTAL, 0, 0);

//利用反射技術拿到mTN對象

reflectionTN();

}

class MyOnClickListener implements View.OnClickListener{

@Override

public void onClick(View v) {

switch (v.getId()) {

case R.id.showtoast:

try {

showMethod.invoke(obj, null);//調用TN對象的show()方法,顯示toast

} catch (Exception e) {

e.printStackTrace();

}

break;

case R.id.closetoast:

try {

hideMethod.invoke(obj, null);//調用TN對象的hide()方法,關閉toast

} catch (Exception e) {

e.printStackTrace();

}

break;

default:

break;

}

}

}

private void reflectionTN() {

try {

field = toast.getClass().getDeclaredField("mTN");

field.setAccessible(true);

obj = field.get(toast);

showMethod = obj.getClass().getDeclaredMethod("show", null);

hideMethod = obj.getClass().getDeclaredMethod("hide", null);

} catch (Exception e) {

e.printStackTrace();

}

}

}
復制代碼

熱點內容
華為手機更換開機密碼如何操作 發布:2025-01-24 14:43:15 瀏覽:699
快手等待上傳 發布:2025-01-24 14:41:37 瀏覽:380
apache和php7 發布:2025-01-24 14:32:26 瀏覽:892
linuxio文件 發布:2025-01-24 13:40:21 瀏覽:438
在excel設密碼如何取消 發布:2025-01-24 13:38:54 瀏覽:483
電腦裝存儲時不能開機 發布:2025-01-24 13:38:52 瀏覽:285
2000人同時在線的小程序需要什麼伺服器 發布:2025-01-24 13:37:17 瀏覽:853
怎麼搭建linux伺服器配置 發布:2025-01-24 13:37:16 瀏覽:113
安卓版什麼時候上線麻將模式 發布:2025-01-24 13:32:48 瀏覽:966
演算法實驗分析 發布:2025-01-24 13:20:25 瀏覽:137