2013-11-15 5 views
1

Я новичок в андроид, и я получил странные проблемы ...App сбой при запуске службы в методе OnClick

Я пытаюсь изменить WifiDirectDemo предоставленного Google, более конкретно, демо дает нам свободу для выбора изображения, которое я хочу передать, но я просто хочу, чтобы он передал конкретное изображение. Исходный код выглядит следующим образом:

public class DeviceDetailFragment extends Fragment implements ConnectionInfoListener { 

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
    mContentView = inflater.inflate(R.layout.device_detail, null); 

    mContentView.findViewById(R.id.btn_start_client).setOnClickListener(
      new View.OnClickListener() { 

       @Override 
       public void onClick(View v) { 
        // Allow user to pick an image from Gallery or other 
        // registered apps     
        Intent intent = new Intent(Intent.ACTION_GET_CONTENT); 
        intent.setType("image/*"); 
        startActivityForResult(intent, CHOOSE_FILE_RESULT_CODE); 
       } 
      }); 
    return mContentView; 
} 

@Override 
public void onActivityResult(int requestCode, int resultCode, Intent data) { 
    // User has picked an image. Transfer it to group owner i.e peer using 
    // FileTransferService. 
    Uri uri = data.getData(); 
    TextView statusText = (TextView) mContentView.findViewById(R.id.status_text); 
    statusText.setText("Sending: " + uri); 
    Log.d(WiFiDirectActivity.TAG, "Intent----------- " + uri); 
    Intent serviceIntent = new Intent(getActivity(), FileTransferService.class); 
    serviceIntent.setAction(FileTransferService.ACTION_SEND_FILE); 
    serviceIntent.putExtra(FileTransferService.EXTRAS_FILE_PATH, uri.toString()); 
    serviceIntent.putExtra(FileTransferService.EXTRAS_GROUP_OWNER_ADDRESS, 
      info.groupOwnerAddress.getHostAddress()); 
    serviceIntent.putExtra(FileTransferService.EXTRAS_GROUP_OWNER_PORT, 8988); 
    getActivity().startService(serviceIntent); 
} 

И он отлично работает. Но после того, как я переместил код из метода onActivityResult в метод onClick, я получил некоторые ошибки во время выполнения. Вот мой код.

@Override 
public void onClick(View v) { 
        // Allow user to pick an image from Gallery or other 
        // registered apps    
    String uristring = "content://com.android.providers.media.documents/document/image%3A25"; 
    Intent serviceIntent = new Intent(getActivity(), FileTransferService.class); 
    serviceIntent.setAction(FileTransferService.ACTION_SEND_FILE); 
    serviceIntent.putExtra(FileTransferService.EXTRAS_FILE_PATH, uristring); 
    serviceIntent.putExtra(FileTransferService.EXTRAS_GROUP_OWNER_ADDRESS, 
      info.groupOwnerAddress.getHostAddress()); 
    serviceIntent.putExtra(FileTransferService.EXTRAS_GROUP_OWNER_PORT, 8988); 
    getActivity().startService(serviceIntent); 
} 

И код ошибки следующим образом:

11-15 00:11:16.397: W/dalvikvm(18595): threadid=11: thread exiting with uncaught exception (group=0x41553b90) 
11-15 00:11:16.397: E/AndroidRuntime(18595): FATAL EXCEPTION: IntentService[FileTransferService] 
11-15 00:11:16.397: E/AndroidRuntime(18595): Process: com.example.android.wifidirect, PID: 18595 
11-15 00:11:16.397: E/AndroidRuntime(18595): java.lang.SecurityException: Permission Denial: opening provider com.android.providers.media.MediaDocumentsProvider from ProcessRecord{42a042a8 18595:com.example.android.wifidirect/u0a77} (pid=18595, uid=10077) requires android.permission.MANAGE_DOCUMENTS or android.permission.MANAGE_DOCUMENTS 
11-15 00:11:16.397: E/AndroidRuntime(18595): at android.os.Parcel.readException(Parcel.java:1461) 
11-15 00:11:16.397: E/AndroidRuntime(18595): at android.os.Parcel.readException(Parcel.java:1415) 
11-15 00:11:16.397: E/AndroidRuntime(18595): at android.app.ActivityManagerProxy.getContentProvider(ActivityManagerNative.java:2848) 
11-15 00:11:16.397: E/AndroidRuntime(18595): at android.app.ActivityThread.acquireProvider(ActivityThread.java:4396) 
11-15 00:11:16.397: E/AndroidRuntime(18595): at android.app.ContextImpl$ApplicationContentResolver.acquireUnstableProvider(ContextImpl.java:2207) 
11-15 00:11:16.397: E/AndroidRuntime(18595): at android.content.ContentResolver.acquireUnstableProvider(ContentResolver.java:1425) 
11-15 00:11:16.397: E/AndroidRuntime(18595): at android.content.ContentResolver.openTypedAssetFileDescriptor(ContentResolver.java:1047) 
11-15 00:11:16.397: E/AndroidRuntime(18595): at android.content.ContentResolver.openAssetFileDescriptor(ContentResolver.java:904) 
11-15 00:11:16.397: E/AndroidRuntime(18595): at android.content.ContentResolver.openInputStream(ContentResolver.java:629) 
11-15 00:11:16.397: E/AndroidRuntime(18595): at com.example.android.wifidirect.FileTransferService.onHandleIntent(FileTransferService.java:63) 
11-15 00:11:16.397: E/AndroidRuntime(18595): at android.app.IntentService$ServiceHandler.handleMessage(IntentService.java:65) 
11-15 00:11:16.397: E/AndroidRuntime(18595): at android.os.Handler.dispatchMessage(Handler.java:102) 
11-15 00:11:16.397: E/AndroidRuntime(18595): at android.os.Looper.loop(Looper.java:137) 
11-15 00:11:16.397: E/AndroidRuntime(18595): at android.os.HandlerThread.run(HandlerThread.java:61) 

Есть ли кто-нибудь может помочь?

Update:

Я добавил разрешение манифеста, вот как манифест выглядит следующим образом:

<?xml version="1.0" encoding="utf-8"?> 
<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.example.android.wifidirect" 
android:versionCode="1" android:versionName="1.0"> 

<uses-sdk android:minSdkVersion="14" /> 
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" /> 
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE" /> 
<uses-permission android:name="android.permission.CHANGE_NETWORK_STATE" /> 
<uses-permission android:name="android.permission.INTERNET" /> 
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> 
<uses-permission android:name="android.permission.READ_PHONE_STATE" /> 
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> 
<uses-permission android:name="android.permission.MANAGE_DOCUMENTS"/> 

<!-- Google Play filtering --> 
<uses-feature android:name="android.hardware.wifi.direct" android:required="true"/> 


<application 
    android:icon="@drawable/ic_launcher" 
    android:label="@string/app_name" 
    android:theme="@android:style/Theme.Holo"> 
    <activity 
     android:name=".WiFiDirectActivity" 
     android:label="@string/app_name" android:launchMode="singleTask"> 
     <intent-filter> 
      <action 
       android:name="android.intent.action.MAIN" /> 
      <category 
       android:name="android.intent.category.LAUNCHER" /> 
     </intent-filter> 
    </activity> 

    <!-- Used for transferring files after a successful connection --> 
    <service android:enabled="true" android:name=".FileTransferService" /> 

</application> 

И приложение по-прежнему падает с той же информацией об ошибке.

Но когда я запускаю следующий код, ошибки не возникает.

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 

    mContentView = inflater.inflate(R.layout.device_detail, null); 
    mContentView.findViewById(R.id.btn_start_client).setOnClickListener(
      new View.OnClickListener() { 

       @Override 
       public void onClick(View v) { 
        // Allow user to pick an image from Gallery or other 
        // registered apps 

        Intent intent = new Intent(Intent.ACTION_GET_CONTENT); 
        intent.setType("image/*"); 
        startActivityForResult(intent, CHOOSE_FILE_RESULT_CODE); 
       } 
      }); 

    return mContentView; 
} 

@Override 
public void onActivityResult(int requestCode, int resultCode, Intent data) { 

    // User has picked an image. Transfer it to group owner i.e peer using 

    String uristring = "content://com.android.providers.media.documents/document/image%3A25"; 

    Intent serviceIntent = new Intent(getActivity(), FileTransferService.class); 
    serviceIntent.setAction(FileTransferService.ACTION_SEND_FILE); 
    serviceIntent.putExtra(FileTransferService.EXTRAS_FILE_PATH, uristring); 
    serviceIntent.putExtra(FileTransferService.EXTRAS_GROUP_OWNER_ADDRESS, 
      info.groupOwnerAddress.getHostAddress()); 
    serviceIntent.putExtra(FileTransferService.EXTRAS_GROUP_OWNER_PORT, 8988); 
    getActivity().startService(serviceIntent); 
} 

Ошибки возникают, когда я перемещаю последовательность строк с onActivityResult на onClick. Я просто не знаю, в чем дело, потому что на самом деле я уже добавил разрешение MANAGE_DOCUMENT манифеста, и он продолжает просить разрешения. И без разрешения в манифесте я могу получить доступ к файлу изображения, если я верну код обратно в onActivityResult. Кто-нибудь знает, почему? Спасибо огромное!

+0

Я думаю, что вам не хватает какого-либо разрешения в файле манифеста – Ruban

+0

Спасибо за ваш ответ! Я смущен этим, если я поместил String uristring = "content: //com.android.providers.media.documents/document/image%3A25"; line в методе onActivityResult, он отлично работает. Ошибка об отказе в разрешении. И я также добавил предоставленную вами линию разрешений, и это не изменило ситуацию. Точно такая же информация об ошибках. Есть идеи об этом? –

+0

Наконец, я обойду эту проблему путем хранения и получения изображений в «Environment.getExternalStoragePublicDirectory» (\t \t Environment.DIRECTORY_PICTURES) «И это работает. Как я сказал в обновлении, проблема происхождения не решена, и я не думаю, что это из-за необъявленного разрешения. Может быть, это потому, что я использую Киткат. [Там] (HTTP: // StackOverflow.com/questions/19837358/android-kitkat-securityexception-when-try-to-read-from-mediastore) - это еще одна статья, которая, похоже, связана с моей проблемой. –

ответ

0

разрешение объявить в своем манифесте

<uses-permission android:name="android.permission.MANAGE_DOCUMENTS"/> 
+0

Я провозгласил разрешение, но он все еще не работает ... Пожалуйста, просмотрите мои обновления. Спасибо! –

0

вам необходимо добавить разрешение ниже в вашем манифесте

<uses-permission android:name="android.permission.MANAGE_DOCUMENTS"/> 
+0

Я добавил строку в свой манифест и все еще получаю ту же ошибку ... Пожалуйста, обратитесь к моим обновлениям за подробной информацией. Большое спасибо! –

+0

Вы узнали, что заставило его пойти правильно? Сейчас я нахожусь в одной и той же лодке! – user462990