2013-03-13 33 views
5

Vì vậy, tôi đang cố gắng lấy URL được gọi vào ứng dụng của mình, nhưng sau khi nó mở ra, nó luôn luôn có vẻ là null không quan trọng tôi là gì làm.Lược đồ URL Android: intent.getData() == null (PhoneGap)

Dưới đây là phần có liên quan của manifest của tôi:

<activity android:name="myapp" android:label="@string/app_name" 
      android:theme="@android:style/Theme.Black.NoTitleBar" 
      android:configChanges="orientation|keyboardHidden|keyboard|screenSize|locale" 
      android:launchMode="singleTask"> 
     <intent-filter> 
      <action android:name="android.intent.action.MAIN" /> 
      <category android:name="android.intent.category.LAUNCHER" /> 
     </intent-filter> 

     <intent-filter> 
      <data android:scheme="myapp" /> 
      <action android:name="android.intent.action.VIEW" /> 
      <category android:name="android.intent.category.DEFAULT" /> 
      <category android:name="android.intent.category.BROWSABLE" /> 
     </intent-filter> 

    </activity> 

Và đây là java của tôi:

@Override 
public void onStart() { 

    super.onStart(); 
    final Intent intent = getIntent(); 

    Uri url = intent.getData(); 

    Log.e("myLog", "Url = " + url); 

} 

Nhật ký được xuất ra "Ý định = null", và tôi không có lỗi.

Tôi không phải là nhà phát triển java nên tôi có thể có một vấn đề đơn giản mà tôi không nhận ra. Tôi sẽ chuyển nó vào ứng dụng PhoneGap của tôi với sendJavascript nhưng là một ứng dụng PhoneGap dường như không liên quan đến vấn đề này.

EDIT:

tôi dường như chỉ được nhận được <intent-filter> đầu tiên khi tôi đăng nhập intent. Dưới đây là các bản ghi:

03-13 12:36:18.593: E/MyAppLog(13793): Intent=Intent { act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] flg=0x10000000 cmp=com.wd.myapp/.myapp (has extras) } 

SOLUTION:

Sau khi rót qua hàng chục bài viết về cách thực hiện các chương trình URL để mở ứng dụng PhoneGap của bạn, và không ai trong số họ là rất mạnh mẽ hoặc làm việc ở tất cả, Tôi sẽ đăng giải pháp đầy đủ của tôi và hy vọng ai đó thấy nó hữu ích.

Bước một: AndroidManifest.xml - Thêm <intent-filter> này vào số <activity>, thay đổi 'urlScheme' thành bất kỳ thứ gì bạn thích. Trong trường hợp này, bạn có thể nhấp vào một liên kết đến urlScheme: ///? Key = val và nó sẽ mở ứng dụng.

<intent-filter> 
    <data android:scheme="urlScheme" /> 
    <action android:name="android.intent.action.VIEW" /> 
    <category android:name="android.intent.category.DEFAULT" /> 
    <category android:name="android.intent.category.BROWSABLE" /> 
</intent-filter> 

Bước hai: myApp.java - Thêm phần sau bên dưới onCreate. Nếu bạn đang sử dụng singleTask, hãy chắc chắn đặt logic intent của bạn trong chức năng onStart (thay vì trong onCreate, vì những người khác đã vượt trội), vì điều đó sẽ cho phép bạn liên kết với ứng dụng của bạn cho dù ứng dụng đó có đang chạy hay không.

@Override 
public void onStart() { 

    super.onStart(); 
    final Intent intent = getIntent(); 

    String url = intent.getDataString(); 

    if(url != "" && url != null) { 
     super.sendJavascript("setTimeout(function() { handleOpenURL('" + url + "'); },1);"); 
    }     


} 

@Override 
protected void onNewIntent(Intent intent) { 
    super.onNewIntent(intent); setIntent(intent); 
} 

Xem câu trả lời được chấp nhận để giải thích về ghi đè onNewIntent.

+0

Tôi nghĩ ý định Intent cuối cùng = getIntent(); nên là Intent intent = intent.getIntent(); –

+0

Làm thế nào? 'intent' chưa tồn tại. Tôi sẽ thử nó mặc dù. – bearfriend

+0

Vâng, nó không phải là một phương pháp. Tôi tin rằng tôi đã đăng nhập 'intent' như là và có một cái gì đó từ nó. Nó chỉ là phương pháp gọi điện thoại trên nó để có được dữ liệu ra khỏi nó luôn luôn là null. – bearfriend

Trả lời

14

Cố gắng ghi đè onNewIntent. Vấn đề là getIntent trả lại số Intent đã bắt đầu Activity, nhưng không phải là lần gần đây nhất. Nhưng bạn có thể ghi đè lên bằng phương thức setIntent.

@Override 
protected void onNewIntent(Intent intent) { 
    super.onNewIntent(intent); 
    setIntent(intent); 
} 
+0

Cảm ơn các công trình như một sự quyến rũ. Chỉ có điều tôi phải làm trên giải pháp của tôi là. Vì tôi đã khởi chạy một hoạt động mới cho biết ActivityZ từ hoạt động chính của tôi, trong phương thức onStart của tôi. Nhưng những gì đã xảy ra như bất cứ khi nào tôi trở lại hoạt động chính nó lại khởi chạy ActivityZ, vì vậy những gì tôi đã làm rõ ràng là thiết lập dữ liệu ý định thành null. – cocoaNoob

0

Mở rộng câu trả lời gốc, trong trường hợp hoạt động chính của bạn khởi chạy hoạt động khác. Sau đó, nó có thể kết thúc một vòng vô hạn của việc khởi động các hoạt động một lần nữa và một lần nữa khi bạn trở lại hoạt động chính từ các hoạt động đưa ra.

Đây là mã

public void onStart(){ 
     super.onStart(); 
     Intent intent = getIntent(); 
     Uri data = intent.getData(); 
     if (data != null) { 
      // explicitly set intent data to null 
      // so on next launch, from same lifecycle of activity 
      // it does not restart the Activity Z. 
      intent.setData(null); 
      Intent activityZ = new Intent(MyActivity.this, ActivityZ.class); 
       businessViewActivity.putExtra("url", data.toString()); 
       startActivity(activityZ); 
     } 
    } 

    @Override 
    protected void onNewIntent(Intent intent) { 
     super.onNewIntent(intent); 
     setIntent(intent); 
    } 

Hy vọng nó giúp.

+0

Bạn cần đặt android: launchMode = "singleTask" trên hoạt động trong tệp AndroidManifest.xml của bạn (xem mã trong câu hỏi) – jackocnr

Các vấn đề liên quan