2011-01-25 30 views
19

Tôi muốn viết STL đơn giản (hình học tập dữ liệu) ứng dụng xem trên Android, nhưng tôi không thể đưa ra nhận định dạng vào hệ thống. Những gì tôi đã viết trong ứng dụng của file manifest của tôi là:đăng ký loại tập tin mới trong Android

<intent-filter> 
    <action android:name="android.intent.action.VIEW" /> 
    <action android:name="android.intent.action.EDIT" /> 
    <action android:name="android.intent.action.PICK" /> 
    <category android:name="android.intent.category.DEFAULT" /> 
    <data android:scheme="http" /> 
    <data android:pathPattern=".*\\.stl" /> 
    <data android:mimeType="application/sla" /> 
    <data android:host="*" /> 
</intent-filter> 

Nhưng tại thời điểm tôi khởi động trình duyệt và đi đến tải một số tập tin mẫu STL, tải bị gián đoạn và tôi đã báo cáo rằng các loại tập tin dữ liệu không rõ cho hệ thống. Tôi không có thiết bị android thực, vì vậy chỉ sử dụng trình mô phỏng, và để phát triển tôi sử dụng C# trên MonoDroid (nhưng tôi không nghĩ đó là vấn đề thành thật)

Bất kỳ ý tưởng nào về chủ đề?

Cảm ơn bạn trước.

+0

Tôi chỉ đoán, nhưng bạn có thể cố gắng để bỏ qua các yếu tố chủ. Ngoài ra logcat có thể cho bạn thấy ý định của mô hình là 'sắp tới' để bạn hiểu rõ hơn hệ thống đang tìm kiếm cái gì. –

Trả lời

21

Tôi đang sử dụng Manifest này để đăng ký (ví dụ) loại tập tin .stl với ứng dụng của tôi:

<?xml version="1.0" encoding="utf-8"?> 
<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
    package="org.test.core" android:versionCode="1" android:versionName="1.0"> 
    <application android:icon="@drawable/icon" android:label="@string/app_name"> 
     <activity android:name=".Testy" android:label="@string/app_name"> 
      <intent-filter> 
       <action android:name="android.intent.action.MAIN" /> 
       <category android:name="android.intent.category.LAUNCHER" /> 
      </intent-filter> 
     </activity> 

     <activity android:name="ThorActivity" android:label="@string/app_name"> 
     </activity> 

     <activity android:name="LokiActivity" android:label="@string/app_name"> 
     </activity> 

     <activity android:name="OdinActivity" android:label="@string/app_name"> 
      <intent-filter> 
       <action android:name="android.intent.action.VIEW" /> 
       <category android:name="android.intent.category.DEFAULT" /> 
       <category android:name="android.intent.category.BROWSABLE" /> 
       <data android:scheme="http" android:host="*" 
        android:pathPattern=".*\\.stl" /> 
       <data android:scheme="https" android:host="*" 
        android:pathPattern=".*\\.stl" /> 
       <data android:scheme="content" android:host="*" 
        android:pathPattern=".*\\.stl" /> 
       <data android:scheme="file" android:host="*" 
        android:pathPattern=".*\\.stl" /> 
      </intent-filter> 
     </activity> 
    </application> 

    <uses-permission android:name="android.permission.INTERNET" /> 
    <uses-permission android:name="android.permission.BLUETOOTH" /> 
    <uses-permission android:name="android.permission.BLUETOOTH_ADMIN" /> 
    <uses-permission android:name="android.permission.READ_PHONE_STATE" /> 
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> 
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> 

</manifest> 

Như bạn thấy, tôi đang liên kết phần mở rộng tập tin .stl đến hoạt động OdinActivity. Bên trong OdinActivity, tôi sử dụng các dòng sau để có được những đường dẫn tập tin để tôi có thể mở nó:

filePath = getIntent().getData().getEncodedPath(); 

Sau đó, tôi chỉ cần mở nó để đọc từ nó:

FileOutputStream out = new FileOutputStream(new File(filePath)); 
+0

hm .. Tôi đã cố gắng thay đổi định dạng .mmmm thành định dạng nổi tiếng (tôi đã sử dụng PDF). Truy cập tài khoản Gmail của tôi và cố tải xuống DPF từ một trong những thư tôi có. Tôi nhận được kết quả chính xác như nhau. Vì vậy, tôi có một số nghi ngờ: tôi có cần triển khai ContentProvider tùy chỉnh của mình để khai báo một cách ngầm định nơi tôi muốn đặt dữ liệu mà Android sẽ tải xuống không? Nghe có vẻ kỳ lạ đối với tôi, sự hỗ trợ của định dạng tùy chỉnh quá phức tạp ... :( – Tigran

+0

Hm ... Bạn đã thử .pdf? Vì đó là một loại tệp rất phổ biến, có lẽ nó đã được đăng ký cho một ứng dụng khác. không biết liệu bạn có thể ghi đè cài đặt đó bằng chương trình của mình hay không. Bạn đã thử với loại tệp bạn muốn, STL chưa? Nếu bạn chỉ muốn liên kết trên điện thoại thông minh của mình và không quan tâm đến mã đó, bạn luôn có thể thực hiện việc này: Menu -> Cài đặt -> Ứng dụng -> Quản lý ứng dụng và chọn ứng dụng mặc định ngay bây giờ và nhấp vào nút Xóa Mặc định – gnclmorais

+0

Vâng, tôi cũng đã thử với STL. Vì vậy, lý do để thử PDF, vì nó cũng được biết đến định dạng và hỗ trợ gần như tất cả mọi người, để hiểu những gì là sai. Nhưng điều kỳ lạ là ngay cả với PDF tôi cũng nhận được kết quả tiêu cực như tôi đã viết. Tôi sử dụng một trình mô phỏng không phải là thiết bị thực, vì vậy tôi tự hỏi có điều gì sai khi sử dụng trình mô phỏng cho trường hợp này hay không. – Tigran

6

Tôi ngạc nhiên là gnclmorais giải pháp nên làm việc. Vì có nhiều mục data trong một intent-filter không hoạt động đối với tôi. Điều gì đã làm công việc cuối cùng là nhiều intent-filter trong một activity:

<activity 
    android:description='@string/Activity_Description' 
    android:icon='@drawable/ic_launcher' 
    android:label='@string/Activity_Name' 
    android:name='net.sourceforge.uiq3.fx603p.Calculator_Activity' 
> 
    <intent-filter> 
    <action 
     android:name='android.intent.action.MAIN' 
    ></action> 
    <category 
     android:name='android.intent.category.LAUNCHER' 
    ></category> 
    </intent-filter> 
    <intent-filter 
    android:icon='@drawable/ic_fx_603p_pf' 
    android:label='FX-603P Simulator Program' 
    android:priority='1' 
    > 
    <category 
     android:name='android.intent.category.DEFAULT' 
    ></category> 
    <action 
     android:name='android.intent.action.VIEW' 
    ></action> 
    <data 
     android:host='*' 
     android:pathPattern='.*\\.pf' 
     android:scheme='file' 
    ></data> 
    </intent-filter> 
    <intent-filter 
    android:icon='@drawable/ic_fx_603p_df' 
    android:label='FX-603P Simulator Datafile' 
    android:priority='1' 
    > 
    <category 
     android:name='android.intent.category.DEFAULT' 
    ></category> 
    <action 
     android:name='android.intent.action.VIEW' 
    ></action> 
    <data 
     android:host='*' 
     android:pathPattern='.*\\.df' 
     android:scheme='file' 
    ></data> 
    </intent-filter> 
    <intent-filter 
    android:icon='@drawable/ic_fx_603p_af' 
    android:label='FX-603P Simulator Allfile (Data and Program)' 
    android:priority='1' 
    > 
    <category 
     android:name='android.intent.category.DEFAULT' 
    ></category> 
    <action 
     android:name='android.intent.action.VIEW' 
    ></action> 
    <data 
     android:host='*' 
     android:pathPattern='.*\\.af' 
     android:scheme='file' 
    ></data> 
    </intent-filter> 
    <intent-filter 
    android:icon='@drawable/ic_fx_603p_pf' 
    android:label='FX-603P Simulator Program' 
    android:priority='1' 
    > 
    <category 
     android:name='android.intent.category.DEFAULT' 
    ></category> 
    <action 
     android:name='android.intent.action.VIEW' 
    ></action> 
    <data 
     android:host='*' 
     android:mimeType='application/x-fx-602p.program' 
    ></data> 
    </intent-filter> 
    <intent-filter 
    android:icon='@drawable/ic_fx_603p_df' 
    android:label='FX-603P Simulator Datafile' 
    android:priority='1' 
    > 
    <category 
     android:name='android.intent.category.DEFAULT' 
    ></category> 
    <action 
     android:name='android.intent.action.VIEW' 
    ></action> 
    <data 
     android:host='*' 
     android:mimeType='application/x-fx-602p.data' 
    ></data> 
    </intent-filter> 
    <intent-filter 
    android:icon='@drawable/ic_fx_603p_af' 
    android:label='FX-603P Simulator Allfile (Data and Program)' 
    android:priority='1' 
    > 
    <category 
     android:name='android.intent.category.DEFAULT' 
    ></category> 
    <action 
     android:name='android.intent.action.VIEW' 
    ></action> 
    <data 
     android:host='*' 
     android:mimeType='application/x-fx-602p.all' 
    ></data> 
    </intent-filter> 
</activity> 

Lưu ý rằng có cả pathPatternmimeType trong một data entry đã không làm việc là tốt. Cuối cùng, tôi không đề cập đến một vài kiểm tra rỗng khi nhận được tên tệp:

/** 
    * <p>Open calculator and load file (if one was passed).</p> 
    * @see android.app.Activity#onStart() 
    */ 
    @Override 
    public void onStart() 
    { 
     android.util.Log.d (Calculator_Activity.TAG, "+ onStart"); 
     super.onStart(); 

     final android.content.Intent intent = getIntent(); 

     if (intent != null) 
     { 
     android.util.Log.d (Calculator_Activity.TAG, "> Got intent : " + intent); 

     final android.net.Uri data = intent.getData(); 

     if (data != null) 
     { 
      android.util.Log.d (Calculator_Activity.TAG, "> Got data : " + data); 

      final String filePath = data.getEncodedPath(); 

      android.util.Log.d (Calculator_Activity.TAG, "> Open file : " + filePath); 

      // file loading comes here. 
     } // if 
     } // if 
     android.util.Log.d (Calculator_Activity.TAG, "- onStart"); 
     return; 
    } // onStart 

Tải thực tế của tệp bị thiếu trong mẫu. Nó sẽ được chèn sau lệnh “Open file”.

+1

Im ngạc nhiên khi bạn ngạc nhiên :). Bạn thấy giải pháp gnclmorais được sử dụng cho chỉ một và chỉ mở rộng tập tin (stl) và giải pháp của bạn là về các phần mở rộng tập tin khác nhau (pf, df, af và vv). Obviuosly bạn đã phải sử dụng một số bộ lọc ý định mỗi một cho mỗi phần mở rộng – Stan

+0

@Stan Và tại sao nhiều 'android: scheme' làm việc tốt hơn sau đó nhiều' android: pathPattern'? Tôi không thể thấy bất kỳ lý do rõ ràng cho điều đó. Lý do không rõ ràng - có luôn có những lý do đó. Nhưng không rõ ràng. Lưu ý rằng nếu bạn xem http://developer.android.com/reference/android/content/Intent.html, bạn sẽ thấy rằng tất cả các ví dụ chỉ có một phần ' 'cho mỗi mục đích. – Martin

+0

Loại loại mime nào là "application/x-fx-602p.all"? Làm thế nào là xây dựng? Bạn đã đăng ký nó theo một cách nào đó để hệ thống nhận ra nó? – AareP

5

Tôi đã thử các giải pháp khác và điều này là người duy nhất mà làm việc cho tôi:

<intent-filter 
      android:icon="@drawable/icon" 
      android:label="Armro File" 
      android:priority="1" > 
      <action android:name="android.intent.action.VIEW" /> 

      <category android:name="android.intent.category.DEFAULT" /> 
      <category android:name="android.intent.category.BROWSABLE" /> 

      <data android:scheme="http" /> 
      <data android:scheme="https" /> 
      <data android:scheme="ftp" /> 
      <data android:scheme="file" /> 
      <data android:host="*" /> 
      <data android:mimeType="*/*" /> 
      <data android:pathPattern=".*\\.myowntype" /> 
     </intent-filter> 

không ai có một ý tưởng tại sao những người khác không làm việc?

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